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


是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]


评论

您是否尝试在GOT部分中设置断点?例如,在_libc_start_main()上。

“位置无关,静态链接”-没有GOT。

我的坏...我读得太快了。对不起。

相关:stackoverflow.com/questions/10483544/…

#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