一開始下 disassemble main
時,還想說這是哪國來的組語,完全看不懂在寫啥
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004006a9 <+0>: push %rbp
0x00000000004006aa <+1>: mov %rsp,%rbp
0x00000000004006ad <+4>: sub $0x40,%rsp
0x00000000004006b1 <+8>: mov $0x400774,%edi
0x00000000004006b6 <+13>: callq 0x400520 <puts@plt>
0x00000000004006bb <+18>: mov $0x40078e,%edi
0x00000000004006c0 <+23>: mov $0x0,%eax
0x00000000004006c5 <+28>: callq 0x400540 <printf@plt>
0x00000000004006ca <+33>: lea -0x40(%rbp),%rax
0x00000000004006ce <+37>: mov %rax,%rdi
0x00000000004006d1 <+40>: callq 0x400560 <gets@plt>
0x00000000004006d6 <+45>: mov $0x40079f,%edi
0x00000000004006db <+50>: callq 0x400520 <puts@plt>
0x00000000004006e0 <+55>: mov $0x0,%eax
0x00000000004006e5 <+60>: leaveq
0x00000000004006e6 <+61>: retq
然後才想到 gdb 預設好像是 at&t 的組語。所以:
(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004006a9 <+0>: push rbp
0x00000000004006aa <+1>: mov rbp,rsp
0x00000000004006ad <+4>: sub rsp,0x40
0x00000000004006b1 <+8>: mov edi,0x400774
0x00000000004006b6 <+13>: call 0x400520 <puts@plt>
0x00000000004006bb <+18>: mov edi,0x40078e
0x00000000004006c0 <+23>: mov eax,0x0
0x00000000004006c5 <+28>: call 0x400540 <printf@plt>
0x00000000004006ca <+33>: lea rax,[rbp-0x40]
0x00000000004006ce <+37>: mov rdi,rax
0x00000000004006d1 <+40>: call 0x400560 <gets@plt>
0x00000000004006d6 <+45>: mov edi,0x40079f
0x00000000004006db <+50>: call 0x400520 <puts@plt>
0x00000000004006e0 <+55>: mov eax,0x0
0x00000000004006e5 <+60>: leave
0x00000000004006e6 <+61>: ret
End of assembler dump.
這就正常多啦。
看起來我們的程式呼叫 gets
時是沒有加保護的。這裏有幾個暫存器:
因為這程式是 64bit,所以暫存器開頭都是 r。然後 rbp 長度會是 8,故返回地址會是 rbp - 0x40 - 0x8
-> rbp - 0x48
。
我們應該是可以影響程式執行路徑啦,問題是我們這裏影響之後可以幹嘛?
這程式沒有 flag()
這種函式,但是題目有附上一個 libc
的檔案。所以我們應該是要用某種方式,生一個 shell 然後想辦法拿 flag。