1

私は CSAPPS の bufbomb ラボに取り組んできましたが、フェーズの 1 つで行き詰まってしまいました。

正しい方向へのナッジが必要なだけなので、プロジェクトの詳細については触れません。指定されたアセンブリ内の「buf」という配列の開始アドレスを見つけるのに苦労しています。

getbuf という関数が与えられます。

#define NORMAL_BUFFER_SIZE 32

int getbuf()
{
   char buf[NORMAL_BUFFER_SIZE];
   Gets(buf);
   return 1;
}

そして、アセンブリは次のようにダンプします。

Dump of assembler code for function getbuf:
0x08048d92 <+0>:    sub    $0x3c,%esp
0x08048d95 <+3>:    lea    0x10(%esp),%eax
0x08048d99 <+7>:    mov    %eax,(%esp)
0x08048d9c <+10>:    call   0x8048c66 <Gets>
0x08048da1 <+15>:    mov    $0x1,%eax
0x08048da6 <+20>:    add    $0x3c,%esp
0x08048da9 <+23>:    ret   
End of assembler dump.


Dump of assembler code for function Gets:
0x08048c66 <+0>:    push   %ebp
0x08048c67 <+1>:    push   %edi
0x08048c68 <+2>:    push   %esi
0x08048c69 <+3>:    push   %ebx
0x08048c6a <+4>:    sub    $0x1c,%esp
0x08048c6d <+7>:    mov    0x30(%esp),%esi
0x08048c71 <+11>:    movl   $0x0,0x804e100
0x08048c7b <+21>:    mov    %esi,%ebx
0x08048c7d <+23>:    jmp    0x8048ccf <Gets+105>
0x08048c7f <+25>:    mov    %eax,%ebp
0x08048c81 <+27>:    mov    %al,(%ebx)
0x08048c83 <+29>:    add    $0x1,%ebx
0x08048c86 <+32>:    mov    0x804e100,%eax
0x08048c8b <+37>:    cmp    $0x3ff,%eax
0x08048c90 <+42>:    jg     0x8048ccf <Gets+105>
0x08048c92 <+44>:    lea    (%eax,%eax,2),%edx
0x08048c95 <+47>:    mov    %ebp,%ecx
0x08048c97 <+49>:    sar    $0x4,%cl
0x08048c9a <+52>:    mov    %ecx,%edi
0x08048c9c <+54>:    and    $0xf,%edi
0x08048c9f <+57>:    movzbl 0x804a478(%edi),%edi
0x08048ca6 <+64>:    mov    %edi,%ecx
---Type <return> to continue, or q <return> to quit---
0x08048ca8 <+66>:    mov    %cl,0x804e140(%edx)
0x08048cae <+72>:    mov    %ebp,%ecx
0x08048cb0 <+74>:    and    $0xf,%ecx
0x08048cb3 <+77>:    movzbl 0x804a478(%ecx),%ecx
0x08048cba <+84>:    mov    %cl,0x804e141(%edx)
0x08048cc0 <+90>:    movb   $0x20,0x804e142(%edx)
0x08048cc7 <+97>:    add    $0x1,%eax
0x08048cca <+100>:    mov    %eax,0x804e100
0x08048ccf <+105>:    mov    0x804e110,%eax
0x08048cd4 <+110>:    mov    %eax,(%esp)
0x08048cd7 <+113>:    call   0x8048820 <_IO_getc@plt>
0x08048cdc <+118>:    cmp    $0xffffffff,%eax
0x08048cdf <+121>:    je     0x8048ce6 <Gets+128>
0x08048ce1 <+123>:    cmp    $0xa,%eax
0x08048ce4 <+126>:    jne    0x8048c7f <Gets+25>
0x08048ce6 <+128>:    movb   $0x0,(%ebx)
0x08048ce9 <+131>:    mov    0x804e100,%eax
0x08048cee <+136>:    movb   $0x0,0x804e140(%eax,%eax,2)
0x08048cf6 <+144>:    mov    %esi,%eax
0x08048cf8 <+146>:    add    $0x1c,%esp
0x08048cfb <+149>:    pop    %ebx
0x08048cfc <+150>:    pop    %esi
0x08048cfd <+151>:    pop    %edi
---Type <return> to continue, or q <return> to quit---
0x08048cfe <+152>:    pop    %ebp
0x08048cff <+153>:    ret   
End of assembler dump.

buf の開始アドレスがどこにあるのか (または、この混乱の中で buf がどこにあるのか!) を見つけるのに苦労しています。誰かが私にそれを指摘することができれば、私はそれを大いに感謝します.

解決策を試みる

Reading symbols from /home/user/CS247/buflab/buflab-handout/bufbomb...(no debugging symbols found)...done.
(gdb) break getbuf
Breakpoint 1 at 0x8048d92
(gdb) run -u user < firecracker-exploit.bin
Starting program: /home/user/CS247/buflab/buflab-handout/bufbomb -u user < firecracker-exploit.bin
Userid: ...
Cookie: ...

Breakpoint 1, 0x08048d92 in getbuf ()
(gdb) print buf
No symbol table is loaded.  Use the "file" command.
(gdb) 
4

4 に答える 4

0
0x08048cd4 <+110>:    mov    %eax,(%esp)
0x08048cd7 <+113>:    **call   0x8048820 <_IO_getc@plt>**
0x08048cdc <+118>:    cmp    $0xffffffff,%eax
0x0848cdf <+121>:    je     0x8048ce6 <Gets+128>
0x08048ce1 <+123>:    cmp    $0xa,%eax
0x08048ce4 <+126>:    jne    0x8048c7f <Gets+25>
0x08048ce6 <+128>:    movb   $0x0,(%ebx)
0x08048ce9 <+131>:    mov    0x804e100,%eax
0x08048cee <+136>:    movb   $0x0,0x804e140(%eax,%eax,2)
0x08048cf6 <+144>:    mov    %esi,%eax
0x08048cf8 <+146>:    add    $0x1c,%esp
0x08048cfb <+149>:    **pop    %ebx**
0x08048cfc <+150>:    **pop    %esi**
0x08048cfd <+151>:    **pop    %edi**
---Type <return> to continue, or q <return> to quit---
0x08048cfe <+152>:    **pop    %ebp**
0x08048cff <+153>:    ret   
End of assembler dump.

私はあなたのasmのフレーバーを知りませんが、そこには開始アドレスを使用する可能性のある呼び出しがあります

プログラムの最後にさまざまなポインタが表示されます

そこから探し始めます

これらの関数の asm を微調整できる場合は、独自のルーチンを入力して、関数の実行時にそれらのポインターがポップされる前にデータをダンプできます。

于 2013-05-18T09:00:16.353 に答える
0

bufスタックに割り当てられます。したがって、アセンブリ リストからそのアドレスを特定することはできません。つまり、実行時bufに関数を入力したときにのみ、 が割り当てられます (したがって、そのアドレスが認識されます) getbuf()

アドレスを知る必要がある場合、1 つのオプションは gbd を使用することです (ただし、-gデバッグ サポートを有効にするフラグを使用してコンパイルすることを確認してください)。

gdb a.out    # I'm assuming your binary is a.out
break getbuf # Set a breakpoint where you want gdb to stop
run          # Run the program. Supply args if you need to
             # WAIT FOR your program to reach getbuf and stop    
print buf

このルートに進みたい場合は、優れた gdb チュートリアル ( example ) が不可欠です。printf内部に配置してそのようにデバッグすることもできますgetbuf-それはあなたが何をしようとしているのかによって異なります。

コードからもう 1 つのポイントが飛び出します。から戻るとgetbuf、 の結果はGets破棄されます。これは、Getsおそらくその結果を stack-allocated に書き込んでいるためですbuf。から戻るとgetbuf、スタックが吹き飛ばされ、確実に buf にアクセスできなくなります。

于 2013-05-18T04:39:41.817 に答える