这些方法在使用 qemu-user + gdb-multiarch 下都可以使用

strip 就是指去除 Linux 程序的调试符号信息。一旦一个程序被 strip 掉符号以后,程序中函数对应的程序地址就会没有了,导致调试非常麻烦。而且 strip 后的程序还分两种情况,一种是开了 PIE 防护,一种没有开。程序一旦开启了 PIE 防护,就会造成程序 ELF 文件中只存放代码的偏移地址,最后运行的地址是不知道的。所以导致调试麻烦

没有开启 PIE 的程序

如果是没有去除符号的程序,我们可以通过 b main 指令来直接给 main 函数下断点

Untitled

但是一旦符号表被 strip 掉。那么一旦程序我们使用这个命令的时候,会发现行不通

Untitled

但是问题不大,尚且还有回旋的余地!

我们在 GDB 中使用 info file 命令,可以得到程序的入口点代码

Untitled

然后很明显,这个程序的入口点地址是 0x4005c0 ,接下来我们使用 b *0x4005c0 指令就能对入口点下断点。然后使用 r 来运行程序

Untitled

我们可以看到入口点的代码在后面调用了 __libc_start_main 这个函数,这个函数用来调用程序的 main 函数,一般他的第一个参数就是我们要找的 main 函数,一般在 amd64 汇编中,第一个参数存放在 rdi 所以这个程序的 main 函数地址就是在 0x400ab9

然后我们执行 b *0x400ab9 对该地址下断点,然后使用 c/continue 指令让程序执行到到下一个断点里面

Untitled

最后我们发现成功进入 main 函数

Untitled

开启 PIE 的程序

如果开启了 PIE 以后,你会发现程序中的所有地址都是一个很小的数字,其实这只是一个偏移地址,然后这个程序的基地址其实是随机的。只有程序运行起来以后,地址才能被确定下来。

Untitled