2011-10-21 10 views
2

シェルコーダのハンドブック(2e)を読んでおり、18-23ページのスタックオーバーフローの再現を試みています。スタックオーバーフローによる命令ポインタのリダイレクト

私はこのコード

void return_input (void) 
{ 
    char array[30]; 
    gets (array); 
    printf(“%s\n”, array); 
} 
main() 
{ 
    return_input(); 
    return 0; 
} 

コンパイルがあります。主な機能のためのアセンブラコードのgcc -fno-stack-protector -o overflow overflow.c

ダンプ:

0x080483ea <main+0>: push %ebp 
0x080483eb <main+1>: mov %esp,%ebp 
0x080483ed <main+3>: call 0x80483c4 <return_input> 
0x080483f2 <main+8>: mov $0x0,%eax 
0x080483f7 <main+13>: pop %ebp 
0x080483f8 <main+14>: ret 

私たちは、コールのアドレスで保存されたリターンアドレスを上書きすることができますが〜return_input()

$ printf 
"AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDD\xed\x83\x04\x08" | ./overflow 
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDí 
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDò 

これにより、入力が2回印刷されます。しかし、私は入力をもう一度促されませんでした。 return_input()への2回目の呼び出しでは、2回目の呼び出しでgets()が呼び出されるべきではありませんか?

+1

スタックポインタをどこに配置するのかを表す10As、10B、10C、6D、そして4文字を提供していますか? 30文字の配列を格納された返信先にあふれさせることなく、それを正確に埋めるのに十分ではありませんか? – Akron

+0

@Akron、そうですね。私はこの本の内容を投稿しましたが、自分のマシンでこれを実行したとき、それはもっと似ていました: '$ printf 'AAAAAAAAAABBBBBBBBBBCCCCCCCCDCDDDDDDDD \ x8f \ x05 \ x40 \ x00 \ x00 \ x00 \ x00 \ x00' ./overflow AAAAAAAAAABBBBBBBBBBCCCCCCCCDDDDDDDDDD @ AAAAAAAAAABBBBBBBBBBCCCCCCCCDDDDDDDDD @ バスエラー – Sanjay

答えて

0

おそらくgets()がstdinから読み込むものと関係があります。あなたのプログラムの

少し変更されたバージョン:私はちょうどそれを実行した場合

#include <stdio.h> 

int n = 1; 

void return_input(void) 
{ 
    char array[30]; 
    gets (array); 
    printf("%s\n", array); 
    if (n--) return_input(); 
} 

int main(void) 
{ 
    return_input(); 
    return 0; 
} 

が、私はそうのように、(各キーの入力が続く)2つの短い文字列を入力することができます

C:\gets.exe 
qwe 
qwe 
123 
123 

ここでqweと123の両方が画面上で繰り返されます(最初に入力すると、2番目は印刷されます)。

I echoコマンドを使用してWindows上のパイププログラムの入力、私は(、2番目の文字列を入力する機会なしに次を取得し得る)何とかそれは二度目と呼ばれていたときに、入力としてゴミを取得するために管理します。

C:\echo qwe|gets.exe 
qwe 
№  ☺ 

gets()はパイプ入力を読み込み、スタックオーバーフローとは何の関係もありません。