2017-12-11 8 views
-2

私の学校のセキュリティプロジェクトをやっています。GDB disass main

私はバイナリを持っていますが、私は2つのことを行い、このバイナリの疑似コードを作って悪用する必要があります。

ASM私はまったく同じソースコードをcで実行しようとしています。私は主にedxに問題があります。私は、cでこれを行うにはどのように何のIDEEを持っていない:

0x080484a5 <+41>: mov edx,0x8048468 

これは、完全なメインのコードです:

Dump of assembler code for function main: 
0x0804847c <+0>: push ebp 
0x0804847d <+1>: mov ebp,esp 
0x0804847f <+3>: and esp,0xfffffff0 
0x08048482 <+6>: sub esp,0x20 
0x08048485 <+9>: mov DWORD PTR [esp],0x40 
0x0804848c <+16>: call 0x8048350 <[email protected]> 
0x08048491 <+21>: mov DWORD PTR [esp+0x1c],eax 
0x08048495 <+25>: mov DWORD PTR [esp],0x4 
0x0804849c <+32>: call 0x8048350 <[email protected]> 
0x080484a1 <+37>: mov DWORD PTR [esp+0x18],eax 
0x080484a5 <+41>: mov edx,0x8048468 
0x080484aa <+46>: mov eax,DWORD PTR [esp+0x18] 
0x080484ae <+50>: mov DWORD PTR [eax],edx 
0x080484b0 <+52>: mov eax,DWORD PTR [ebp+0xc] 
0x080484b3 <+55>: add eax,0x4 
0x080484b6 <+58>: mov eax,DWORD PTR [eax] 
0x080484b8 <+60>: mov edx,eax 
0x080484ba <+62>: mov eax,DWORD PTR [esp+0x1c] 
0x080484be <+66>: mov DWORD PTR [esp+0x4],edx 
0x080484c2 <+70>: mov DWORD PTR [esp],eax 
0x080484c5 <+73>: call 0x8048340 <[email protected]> 
0x080484ca <+78>: mov eax,DWORD PTR [esp+0x18] 
0x080484ce <+82>: mov eax,DWORD PTR [eax] 
0x080484d0 <+84>: call eax 
0x080484d2 <+86>: leave 
0x080484d3 <+87>: ret 

あなたは41 +メインラインを実行する方法を見つけるために私を助けることができます:)してください?

答えて

1

0x8048468はおそらく数に基づいて、ポインタ値であるありがとう。たぶん関数ポインタは、0x8048350(mallocのPLTエントリ)より上のページにあるためです。しかし、たぶん静的バッファへのポインタ(文字列リテラルのような読み込み専用バッファかもしれません)。

だからおそらくvoid *edx = "hello world";またはvoid *edx = &some_functionとなり、何とかそれを使用します。 Cのステートメントは単一のasm命令にはマッピングされませんが、最適化されていない出力(gcc -O0)の場合、各Cステートメントはメモリ内のすべての値で終了する命令の連続ブロックにマップされます。 (これは、デバッガでC変数を変更しても、最適化されていないコードで "動作"させられることを意味します)。 mov-immediateの後の次の命令のメモリに格納された後に、その値で正確に何が行われているのかわかりません。

ソース(バイナリにコンパイルしてから逆アセンブルする代わりにgcc -Sではなく)がある場合は、コンパイラのasm出力を見てください。ある場合は、objdump -drwC -Mintelを使用して再配置情報を取得してください。または、nmを使用して、シンボルテーブルで検索してください。

関数ポインタの場合、そのアドレスの逆アセンブリは意味をなさないはずです。

+0

0x8048468は、関数yesのポインタです。私はこのLinuxディストリビューションにnmを持っていません –