事情的起因是這樣的。
我在寫從題目入門指針和動態一二維數組的歷程(萌新入門可參考)(下篇)的時候想試試二維數組輸出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函數來完成pwn
看來還要補補libc的知識
看來好像是入門教程五
i春秋上好像有全套教程,先放這裏慢慢學
https://bbs.ichunqiu.com/article-1797-1.html
總結:話說我就做c語言第五章的一道課後習題怎麼轉向學pwn了
見鬼了。