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
是xecutable。
$ 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解决方案。
如果直接执行而不禁用ASLR,成功的解决方案将在ld.so中的
_start
处中断。它应该看起来像这样: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]
#1 楼
更新:GDB 8.1有一个starti
命令,如下面/ u / ruslan 所述,在启动目标进程之前在未映射地址上设置断点有效地做到了这一点。这不是正确的功能,而是设置断点失败的副作用。
(gdb) break *0
Breakpoint 1 at 0x0
(gdb) r
Starting program: /home/user/ld.so
Error in re-setting breakpoint 1: Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x0
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x0
(gdb) x/i $pc
=> 0x7faae3a25cd0: mov rdi,rsp
#2 楼
从GDB 8.1开始,有一个特殊的命令:starti
。 GDB会话示例:$ gdb /bin/true
Reading symbols from /bin/true...(no debugging symbols found)...done.
(gdb) starti
Starting program: /bin/true
Program stopped.
0xf7fdd800 in _start () from /lib/ld-linux.so.2
(gdb) x/5i $pc
=> 0xf7fdd800 <_start>: mov eax,esp
0xf7fdd802 <_start+2>: call 0xf7fe2160 <_dl_start>
0xf7fdd807 <_dl_start_user>: mov edi,eax
0xf7fdd809 <_dl_start_user+2>: call 0xf7fdd7f0
0xf7fdd80e <_dl_start_user+7>: add ebx,0x1f7e6
#3 楼
您可以定义gdb函数来中断libc_star_main的第一个参数。第一个si / ni是加载libc本身。将其放在您的.gdbinit文件中。define bmain
si
ni
b __libc_start_main
c
b *($rdi)
c
end
评论
您是否尝试在GOT部分中设置断点?例如,在_libc_start_main()上。“位置无关,静态链接”-没有GOT。
我的坏...我读得太快了。对不起。
相关:stackoverflow.com/questions/10483544/…