2

Cプログラムを使用してUbuntu 10.04でバッファをオーバーフローさせようとしており、リターンアドレスを関数「ジャンク」に流用しています。しかし、リターンアドレスを未使用の関数「ジャンク」のアドレスで上書きすることはできません。スタックの 12 バイトに未知のアドレスをダンプするだけです。トラブルシューティングを手伝ってください。ここにCコードがあります: -

    (gdb) list 
    1   #include<stdio.h>
    2   void display()
    3   {
    4       char buff[8];
    5       gets(buff);
    6       puts(buff);
    7   }
    8   main()
    9   {
    10      display();
    (gdb) 
    11      return(0);
    12  }
    13  junk()
    14  {
    15      printf("cracked");
    16  }

main の逆サンブルされたコードは次のとおりです。- 関数 main のアセンブラー コードのダンプ:

    0x08048462 <+0>:    push   %ebp
    0x08048463 <+1>:    mov    %esp,%ebp
    0x08048465 <+3>:    call   0x8048444 <display>
    0x0804846a <+8>:    mov    $0x0,%eax
    0x0804846f <+13>:   pop    %ebp
    0x08048470 <+14>:   ret    

アセンブラー・ダンプの終わり。

関数表示用のアセンブラ コードのダンプ:

    0x08048444 <+0>:    push   %ebp
    0x08048445 <+1>:    mov    %esp,%ebp
    0x08048447 <+3>:    sub    $0xc,%esp
    0x0804844a <+6>:    lea    -0x8(%ebp),%eax
    0x0804844d <+9>:    mov    %eax,(%esp)
    0x08048450 <+12>:   call   0x8048350 <gets@plt>
    0x08048455 <+17>:   lea    -0x8(%ebp),%eax
    0x08048458 <+20>:   mov    %eax,(%esp)
    0x0804845b <+23>:   call   0x8048380 <puts@plt>
    0x08048460 <+28>:   leave  
    0x08048461 <+29>:   ret    

アセンブラー・ダンプの終わり。

関数ジャンクのアセンブラー コードのダンプ:

    0x08048471 <+0>:    push   %ebp
    0x08048472 <+1>:    mov    %esp,%ebp
    0x08048474 <+3>:    sub    $0x4,%esp
    0x08048477 <+6>:    mov    $0x8048550,%eax
    0x0804847c <+11>:   mov    %eax,(%esp)
    0x0804847f <+14>:   call   0x8048370 <printf@plt>
    0x08048484 <+19>:   leave  
    0x08048485 <+20>:   ret    

アセンブラー・ダンプの終わり。

今、私はスタック保護なしでそれを組み立てます:-

    gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o buffer buffer.c

次のように入力した場合:- printf "wwwwwwww\x72\x84\x04\x08" | 。/バッファ

値:- "x72\x84\x04\x08" は、未使用関数 "ジャンク" の最初の命令の流用アドレスとして。12バイトにいくつかの奇妙なメモリ値とリターンアドレスも保存しますが、私のアドレスは保存しません。そして再び「セグメンテーション違反」を与えます。新しい Linux フレーバーでバッファを利用する他の方法はありますか?

4

1 に答える 1

1

leave は次と同等です。

movl %ebp, %esp
popl %ebp

したがって、あなたの場合、%ebp に 'wwww' を指定すると、プログラムは次のようなことを試みます。

movl $0x77777777, %esp    ; 0x77777777 = 'wwww'
popl %ebp                 ; read from address 0x77777777!

%esp には適切な値を指定する必要があります!

于 2012-09-14T20:31:36.370 に答える