<< 関数への引数渡し | top | main関数内でローカル変数を使う >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

GDB

 「HACKING:美しき策謀」ではGDBというデバッガを使っている。

使ってみるとこれが便利。手始めにHello worldプログラムを解析した。

まず、

gcc -g test.c

でデバッグ情報を付加してコンパイルする。gdbを起動する。

gdb -q ./a.out

list

と入力すればソースコードが表示される。

(gdb) list
1	#include <stdio.h>
2	
3	int main(void)
4	{
5	printf("Hello world¥n");
6	return 0;
7	}

逆アセンブルする。

(gdb) dissasemble main Dump of assembler code for function main: 0x08048374 <main+0>: push ebp 0x08048375 <main+1>: mov ebp,esp 0x08048377 <main+3>: sub esp,0x8 0x0804837a <main+6>: and esp,0xfffffff0 0x0804837d <main+9>: mov eax,0x0 0x08048382 <main+14>: sub esp,eax 0x08048384 <main+16>: mov DWORD PTR [esp],0x8048474 0x0804838b <main+23>: call 0x80482a0 <printf@plt> 0x08048390 <main+28>: mov eax,0x0 0x08048395 <main+33>: leave 0x08048396 <main+34>: ret End of assembler dump.
main+14あたりまでがたぶん関数のプロローグと呼ばれる部分

お決まりの、ベースポインタを退避させて、スタックポインタの値を入れて、スタックポインタをデクリメントして・・・、という部分。

そのあと、main+16でespレジスタの値を0x8048474にしている。このメモリアドレスの

内容を表示すると、

(gdb) x/20b 0x8048474
0x8048474:      0x48    0x65    0x6c    0x6c    0x6f    0x20    0x77    0x6f
0x804847c:      0x72    0x6c    0x64    0x0a    0x00    Cannot access memory at address 0x8048481

x/20bは指定アドレス以降を1バイト単位で20個表示するコマンド。x/iでアセンブリ表示。x $eipとかでレジスタに格納されたアドレスの内容表示。

asciiコードと照らし合わせるとこれがHello world。

レジスタを使って引数を渡している。エピローグ(ベースポインタ、スタックポインタの復元)がないぞ、

と思ったらleave命令がエピローグの実行をする命令らしい。

ここからgdbのコマンド覚書。

・ブレイクポイントの設定
b 1
b main

・レジスタに格納された値をみる
i r  eip

・ステップ実行
step
next
stepi
nexti
・run
run or r
・ブレイクポイント削除
delete

ジャジャガッチ | アセンブリ言語 | 07:12 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 07:12 | - | - |
Comment









Trackback
URL:

09
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH