给定一个与位置无关、静态链接、剥离的二进制文件,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]