這題的說明如下。
Ready to go shopping?
Server running at shop.chal.pwning.xxx:9916
如果打開程式,會發現介面長這樣:
有四個指令可以用。
a
新增物品l
列出物品n
改名c
結賬拿到程式,當然就是 gdb ./program
。
但一進去發現:
這程式沒有 main? 好像有點奇怪阿...
經過 c - How to disassemble the main function of a stripped application? - Stack Overflow 指點,我們可以試試看下:
根據文章,這應該是因為編譯時把 Symbol 拔掉了。
[es@es-l tmp]$ file program
program: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=050db5e64b7e6b7222e3d458e52acbf1e0509320, stripped
所以這程式應該是編譯後,用 strip
把 symbol 弄掉。
但我們可以看 .text
的部分。其實 info functions
的時候就說了這程式進入點在某位置,故我們去看該位置所屬的 .text
看看。
__libc_start_main 呼叫時,第一個參數是 main()
的位置。所以最後一個被 mov
上 rdi
的東西,就會是第一個參數 (在 stack 之上)。
接下來會遇到其他問題。
(gdb) break *0x400db1
Breakpoint 1 at 0x400db1
(gdb) r
Starting program: /tmp/program
Missing separate debuginfos, use: dnf debuginfo-install glibc-2.27-32.fc28.x86_64
這時候又不能下 disassemble *0x400db1
,因為這不是正常的函數名稱...
(gdb) disassemble *0x400db1
No function contains specified address.
如果亂猜大小,回來的內容也不盡正確。也不能用 n
s
單步執行。
(gdb) n
Cannot find bounds of current function
(gdb) s
Cannot find bounds of current function
(gdb)
(gdb) disassemble *0x400db1,*0x400db2
Dump of assembler code from 0xffffffffe5894855 to 0x48e58948:
End of assembler dump.
這邊似乎有點麻煩。在考慮要不要用 gdb 以外的工具來拆。