web関連tips備忘録

| 1 |

x86アセンブリ言語での関数コールの検証


〇〇塾の講師からアセンブリ言語の関数コールの仕組みを理解するために判りやすく、よくできたサイトとして紹介された
X86アセンブリ言語での関数コールのサンプル.TEXTをコンパイルして説明通りの動きになるか検証してみた。

注1:
当該サイトは32ビットPCで説明されているようなので、64ビットPCではレジスタ名の先頭の「e」を「r」に書き換えて検証する。

汎用レジスターの通例での役割
ax(アキュームレータレジスタ):演算の結果を格納する。
cx(カウンタレジスタ):ループの回数などのカウントを格納する。
dx(データレジスタ):演算に用いるデータを格納する。
bx(ベースレジスタ):アドレスのベース値を格納する。
si(ソースインデックスレジスタ):一部のデータ転送命令において、データの転送元を格納する。
di(ディストネーションインデックスレジスタ):一部のデータ転送命令において、データの転送先を格納する。

特殊レジスタの専用用途
bp(ベースポインタレジスタ):現在のスタックフレームにおける底のアドレスを保持する。
sp(スタックポインタレジスタ):現在のスタックトップのあどれすを保持する。
ip(インストラクションポインタレジスタ):次に実行するアセンブリ命令のアドレスを保持する。

注2:
gccでコンパイル:
インテル記法で説明されているのでサンプル.TEXTの上部に次の2行を挿入する。
.intel_syntax noprefix
.global スタート関数名

nasmでコンパイル:
サンプル.TEXTの上部に次の2行を挿入する。
section .text
global _start

注3:
gccでコンパイル:
ターミに下記の要領いずれかでタイプして実行する。
$ gcc sample1.s -o sample1
$ gcc -nostdlib sample1.s -o sample1 (ライセンス表示を出さない)
(”-o 出力ファイル名”を付けなかったらa.outで出力される?)

nasmでコンパイル:
ソースをコンパイルしてオブジェクトファイルを作成後、オブジェクトファイルから実行ファイルを作成する。
これらを1行で一気に行うには次のようにタイプする。
nasm -g -f elf64 sample1.asm && ld sample1.o -o sample1asm

参考サイト:アセンブリ言語をコンパイル・実行してみる


事例1:スタック(PUSH・POP命令)
sample1.s
====
/*.intel_syntax noprefix*/
.intel_syntax noprefix
.global _start

_start:
push 1
push 2
push 3
pop rax
pop rcx
pop rax
=======

【gdb】で逆アセンブル
gccでコンパイルした実行ファイルの場合
$ gdb sample1
nasmでコンパイルした実行ファイルの場合
$ gdb -ex 'set disassembly-flavor intel' sample1asm
(-ex 'set disassembly-flavor intel'無しはAT&T記法になる)

GNU gdb 〜ライセンス表示〜
Reading symbols from sample1...(no debugging symbols found)...done.
(gdb) b _start
Breakpoint 1 at 0x241
(gdb) r
Starting program: /yourfolder/sample1
Breakpoint 1, 0x0000555555554241 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
=> 0x0000555555554241 <+0>: pushq $0x1
0x0000555555554243 <+2>: pushq $0x2
0x0000555555554245 <+4>: pushq $0x3
0x0000555555554247 <+6>: pop %rax
0x0000555555554248 <+7>: pop %rcx
0x0000555555554249 <+8>: pop %rax
End of assembler dump.
(gdb) i r rax rcx rsp rip
rax 0x1c 28
rcx 0x7fffffffe0c8 140737488347336
rsp 0x7fffffffe0b0 0x7fffffffe0b0
rip 0x555555554241 0x555555554241 <_start>
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000000
0x7fffffffe0a0: 0x0000000000000000 0x00007ffff7dd9c5a
(gdb) si
0x0000555555554243 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
0x0000555555554241 <+0>: pushq $0x1
=> 0x0000555555554243 <+2>: pushq $0x2
0x0000555555554245 <+4>: pushq $0x3
0x0000555555554247 <+6>: pop %rax
0x0000555555554248 <+7>: pop %rcx
0x0000555555554249 <+8>: pop %rax
End of assembler dump.
(gdb) i r rax rcx rsp rip
rax 0x1c 28
rcx 0x7fffffffe0c8 140737488347336
rsp 0x7fffffffe0a8 0x7fffffffe0a8
rip 0x555555554243 0x555555554243 <_start+2>
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000000
0x7fffffffe0a0: 0x0000000000000000 0x0000000000000001
(gdb) si
0x0000555555554245 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
0x0000555555554241 <+0>: pushq $0x1
0x0000555555554243 <+2>: pushq $0x2
=> 0x0000555555554245 <+4>: pushq $0x3
0x0000555555554247 <+6>: pop %rax
0x0000555555554248 <+7>: pop %rcx
0x0000555555554249 <+8>: pop %rax
End of assembler dump.
(gdb) i r rax rcx rsp rip
rax 0x1c 28
rcx 0x7fffffffe0c8 140737488347336
rsp 0x7fffffffe0a0 0x7fffffffe0a0
rip 0x555555554245 0x555555554245 <_start+4>
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000000
0x7fffffffe0a0: 0x0000000000000002 0x0000000000000001
(gdb) si
0x0000555555554247 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
0x0000555555554241 <+0>: pushq $0x1
0x0000555555554243 <+2>: pushq $0x2
0x0000555555554245 <+4>: pushq $0x3
=> 0x0000555555554247 <+6>: pop %rax
0x0000555555554248 <+7>: pop %rcx
0x0000555555554249 <+8>: pop %rax
End of assembler dump.
(gdb) i r rax rcx rsp rip
rax 0x1c 28
rcx 0x7fffffffe0c8 140737488347336
rsp 0x7fffffffe098 0x7fffffffe098
rip 0x555555554247 0x555555554247 <_start+6>
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000003
0x7fffffffe0a0: 0x0000000000000002 0x0000000000000001
(gdb) si
0x0000555555554248 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
0x0000555555554241 <+0>: pushq $0x1
0x0000555555554243 <+2>: pushq $0x2
0x0000555555554245 <+4>: pushq $0x3
0x0000555555554247 <+6>: pop %rax
=> 0x0000555555554248 <+7>: pop %rcx
0x0000555555554249 <+8>: pop %rax
End of assembler dump.
(gdb) i r rax rcx rsp rip
rax 0x3 3
rcx 0x7fffffffe0c8 140737488347336
rsp 0x7fffffffe0a0 0x7fffffffe0a0
rip 0x555555554248 0x555555554248 <_start+7>
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000003
0x7fffffffe0a0: 0x0000000000000002 0x0000000000000001
(gdb) si
0x0000555555554249 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
0x0000555555554241 <+0>: pushq $0x1
0x0000555555554243 <+2>: pushq $0x2
0x0000555555554245 <+4>: pushq $0x3
0x0000555555554247 <+6>: pop %rax
0x0000555555554248 <+7>: pop %rcx
=> 0x0000555555554249 <+8>: pop %rax
End of assembler dump.
(gdb) i r rax rcx rsp rip
rax 0x3 3
rcx 0x2 2
rsp 0x7fffffffe0a8 0x7fffffffe0a8
rip 0x555555554249 0x555555554249 <_start+8>
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000003
0x7fffffffe0a0: 0x0000000000000002 0x0000000000000001
(gdb) si
0x000055555555424a in ?? ()
(gdb) i r rax rcx rsp rip
rax 0x1 1
rcx 0x2 2
rsp 0x7fffffffe0b0 0x7fffffffe0b0
rip 0x55555555424a 0x55555555424a
(gdb) x/-6gx 0x7fffffffe0b0
0x7fffffffe080: 0x0000000000000000 0x0000555555554241
0x7fffffffe090: 0x00007fffffffe0b0 0x0000000000000003
0x7fffffffe0a0: 0x0000000000000002 0x0000000000000001
(gdb) quit
A debugging session is active.

Inferior 1 [process 15161] will be killed.

Quit anyway? (y or n) y

バイナリー解析 2018-10-16(火) 13:27:10 - kei - TrackBacks
| 1 |
LINK