akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

1/6 アセンブリとデバッガ

アセンブリ言語gdbのデバッガで確認する

アセンブリ言語で書いたファイル:hello.asm

 

$ nasm -f elf64 -o hello.o hello.asm

$ ld -o hello hello.o

$ ./hello

=> hello world

 

$gdb -q ./hello

(gdb) break _start

(gdb) run

Note: breakpoint 1 (disabled) also set at pc 0x7ffff7fd6210.

Breakpoint 2 at 0x7ffff7fd6210

(gdb) set disassembly-flavor intel

(gdb) disas

=>逆アセンブリされた内容が表示される

 

(gdb) stepi  #アセンブラの命令を1行ずつ進める

(gdb) info register  #停止地点においての各レジスタを表示

(gdb) x/32xw $rsp  #rspから32バイト分を16進数で表示

(gdb) print/x $rax  #raxの内容を16進数で表示

 

■読み進めて「ほー」ってなったこと

・pushするごとに綺麗にスタックに乗せられていくのがデバッガで確認できた

・stepi しながらinfo registerで該当のレジスタに値が入っていくことが確認できた

・execveの引数はrax, rdi, rsi, rdx

レジスタに値を入れるのと、スタックにpushするのはまた違う

レジスタに入れるのは引数として設定するため?

・スタックにpushするのは、任意の文字列、アドレス、配列をうまく連ねるため