C
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 int main(int argc, char* argv[]){ 6 int i; 7 char x[5]; 8 char text[1024]; 9 strcpy(text, argv[1]); 10 11 for(i = 0; i < 5; i++) 12 x[i] = i; 13 printf("%p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p\n\n"); 14 15 printf(text); 16 printf("\n%p, %p, %p, %p, %p, %p\n", &i, &x[0], &x[1], &x[2], &x[3], &x[4]); 17 return 0; 18 }
結果が大量なの省略しますが、
> cat stack_overflow.txt | grep 0x7ffecd83e0 ,,,0x7fabd759d127, 0x7ffecd83e060, 0x7ffecd83dec8,,,0x7ffecd83e030, 0x7ffecd83e090,,,0x7ffecd83e058,,,0x7ffecd83e090,,,0x7ffecd83e030,,,, 0x7ffecd83e06c, 0x7ffecd83e067, 0x7ffecd83e068, 0x7ffecd83e069, 0x7ffecd83e06a, 0x7ffecd83e06b
となるのですが、
隣り合わせの、0x7fabd759d127, 0x7ffecd83e060, 0x7ffecd83dec8を計算すると
Bash
1echo "ibase = 16;7FFECD83E060 - 7FFECD83DEC8" | bc 2408 3 4echo "ibase = 16;7FABD759D127 - 7FFECD83E060" | bc 5-356317269817 6
となりました。
char x[5]の全要素は0x7ffecd83e060,の辺りあるはずです。たぶん・・・
アドレスの順番が結構デタラメで順序よく入っているわけではないようですが、char x[5] の全要素の連続するアドレスがどこにあるかを調べようとしても出てこなかったのです。
%pの数が大きくなりすぎて・・・
%pによるスタック領域のアドレスの確認の結果、アドレスの差が結構大きくなっている理由は何ですか?
スタック領域を見ているはずなのに、どうして、char x[5]のアドレスが出現しないのでしょうか?
%pを連続的にならべてprintf()を行っているのですが、なんかスタック領域のアドレスを見ているというより、何のアドレス群なのか分からなくなってきてしまったのですが・・・
どなたか教えてください。
Linux 64bit です。
「追記」
C
1#include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 int main(int argc, char* argv[]){ 6 int i; 7 int x[20]; 8 char text[1024]; 9 strcpy(text, argv[1]); 10 11 for(i = 0; i < 20; i++) 12 x[i] = i; 13 14 printf(text); 15 printf("\n%p, %p, %p, %p, %p, %p\n", &i, &x[0], &x[1], &x[2], &x[3], &x[4]); 16 return 0; 17 } 18
./stack_overflow %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x > stack_overflow.txt cat stack_overflow.txt b055bae0,13,252c7825,18f5c840,b4ebda50,b055b138,b055ac78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,252c7825,2c78252c,78252c78,b50cfd58,1,0,1,b50d29d8,0,5e400000,0,b50d34c0,b055ad50,18f5c391,b50d29d8,b055ad40,b4eae740,3de00ec7,ffffffff,b4b2f7f0,b4b16b98,b50cf4c0,b4b10000,398020,b055af20,b4c2f6e5,0,0,0,b056d1d8,0,0,0,b4eaea20,b50d29d8,b4eb7124,7,8,b50d3700,b056d1a8,b056d298 0x7ffcb055b04c, 0x7ffcb055aff0, 0x7ffcb055aff4, 0x7ffcb055aff8, 0x7ffcb055affc, 0x7ffcb055b000
となったときに、
おそらく、b055bae0,13,252c7825,18f5c840,b4ebda50,b055b138,b055ac78
の部分に int i ~ int x[5] の値が含まれているはずです。
それがどれなのかをみつけたいのです。
ちなみに、大部分は以下のようなコードがが占めています。
printf "\x25\x78\x2c\n"
%x,

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。