鉴于位置无关、静态链接、剥离的二进制文件,GDB 中似乎没有办法在不禁用 ASLR 的情况下在入口点设置断点。
break start
和类似的功能不起作用,因为没有符号信息set stop-on-solib-events 1
不起作用,因为二进制文件不是动态链接的break *0xdeadbeef
因为入口点不起作用,因为在二进制文件启动之前入口点是未解析的catch load
不起作用,因为它不加载任何库start
不起作用,因为main
未定义且未加载任何库
如果不修补二进制文件,我可以使用什么机制在第一条指令执行时中断?
可能的?
由于现在已删除的对该问题的回答说 PIE 静态链接的二进制文件是不可能的,一个简单的例子是链接器本身。
它是静态链接的。
$ ldd /lib/x86_64-linux-gnu/ld-2.19.so
statically linked
它是可执行的。
$ strace /lib/x86_64-linux-gnu/ld-2.19.so
execve("/lib/x86_64-linux-gnu/ld-2.19.so", ["/lib/x86_64-linux-gnu/ld-2.19.so"], [/* 96 vars */]) = 0
brk(0) = 0x7ff787b3d000
writev(2, [{"Usage: ld.so [OPTION]... EXECUTA"..., 1373}], 1Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]
它与位置无关。
$ readelf -h /lib/x86_64-linux-gnu/ld-2.19.so | grep DYN
Type: DYN (Shared object file)
解决方案
看起来这可以通过使用一些可用的事件用 Python 来完成:http : //asciinema.org/a/19078
但是,我想要一个本机 GDB 解决方案。
_start
在不禁用 ASLR 的情况下直接执行时,成功的解决方案将在 ld.so 中中断。它应该是这样的:
sh $ strip -s /lib/x86_64-linux-gnu/ld-2.19.so -o ld.so
sh $ gdb ./ld.so
(gdb) $ set disable-randomization off
(gdb) $ <your magic commands>
(gdb) $ x/i $pc
=> 0x7f9ba515d2d0: mov rdi,rsp
(gdb) $ info proc map
process 10432
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x7f9ba515c000 0x7f9ba517f000 0x23000 0x0 /lib/x86_64-linux-gnu/ld-2.19.so
0x7f9ba537e000 0x7f9ba5380000 0x2000 0x22000 /lib/x86_64- linux-gnu/ld-2.19.so
0x7f9ba5380000 0x7f9ba5381000 0x1000 0x0
0x7fffc34c7000 0x7fffc38ca000 0x403000 0x0 [stack]
0x7fffc398b000 0x7fffc398d000 0x2000 0x0 [vdso]
0xffffffffff600000 0xffffffffff601000 0x1000 0x0 [vsyscall]