用puts函數出現的奇妙景象(順便擦點pwn的邊)

事情的起因是這樣的。
我在寫從題目入門指針和動態一二維數組的歷程(萌新入門可參考)(下篇)的時候想試試二維數組輸出a[i]會不會輸出一行
然後寫個代碼

#include<stdio.h>
int main()
{	int i,j; 
	char a[10][10];
	for(i=0;i<10;i++)
	 	{for(j=0;j<10;j++)
	 	a[i][j]='z';} 
	for(i=0;i<10;i++)
	  puts(a[i]);
	return 0;
} 

猜猜運行後的結果
是不是和我一開始想的一樣,會輸出10*10的zzzzz矩陣呢

結果輸出來是這樣的
在這裏插入圖片描述
迷了,然後試着把輸出改成兩層循環,不用puts()

	for(i=0;i<10;i++)
	  {
	  	for(j=0;j<10;j++)
	  	printf("%c",a[i][j]);
	  	printf("\n");
	  } 

在這裏插入圖片描述這回輸出的是正常的
那應該是puts函數的問題
再試試改成單層循環的printf

	  	printf("%s\n",a[i]);

在這裏插入圖片描述呦呵,見鬼了。
聽說puts只能輸出一行內容,那把它改成11行是不是就寫不下了?
把代碼改成11行
ctrl+f替換
在這裏插入圖片描述在這裏插入圖片描述pu,puts()輸出了兩行?
大白天見鬼的我轉身把鬼丟給了精通pwn的師兄
對沒錯還是這隻
在這裏插入圖片描述
然後我:在這裏插入圖片描述

自己的思考是字符串結尾都有個\0的,我沒有\0,所以它會一直沿着地址把後面的都輸出來,而數組在內存裏是連續的。所以第一行不但輸出了自己的,還輸出了後面9行,一共1010一百個,第二行的地址是從第一行後面往後移動十個開始的,所以是910爲90個,一直到最後爲10個,數了下果真如此。
然後百度下puts的/x00截斷是什麼東西
在這裏插入圖片描述

pwn???
然後大概搜出來有意思的有這麼些個東西
利用puts函數泄露libc內存信息

puts和libc內存關係

大致是講如何利用puts函數來完成pwn
在這裏插入圖片描述
看來還要補補libc的知識
在這裏插入圖片描述看來好像是入門教程五
i春秋上好像有全套教程,先放這裏慢慢學
https://bbs.ichunqiu.com/article-1797-1.html

總結:話說我就做c語言第五章的一道課後習題怎麼轉向學pwn了
見鬼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章