这些方法在使用 qemu-user + gdb-multiarch 下都可以使用
strip 就是指去除 Linux 程序的调试符号信息。一旦一个程序被 strip 掉符号以后,程序中函数对应的程序地址就会没有了,导致调试非常麻烦。而且 strip 后的程序还分两种情况,一种是开了 PIE 防护,一种没有开。程序一旦开启了 PIE 防护,就会造成程序 ELF 文件中只存放代码的偏移地址,最后运行的地址是不知道的。所以导致调试麻烦
如果是没有去除符号的程序,我们可以通过 b main
指令来直接给 main 函数下断点
但是一旦符号表被 strip 掉。那么一旦程序我们使用这个命令的时候,会发现行不通
但是问题不大,尚且还有回旋的余地!
我们在 GDB 中使用 info file
命令,可以得到程序的入口点代码
然后很明显,这个程序的入口点地址是 0x4005c0
,接下来我们使用 b *0x4005c0
指令就能对入口点下断点。然后使用 r
来运行程序
我们可以看到入口点的代码在后面调用了 __libc_start_main
这个函数,这个函数用来调用程序的 main
函数,一般他的第一个参数就是我们要找的 main
函数,一般在 amd64 汇编中,第一个参数存放在 rdi
所以这个程序的 main
函数地址就是在 0x400ab9
然后我们执行 b *0x400ab9
对该地址下断点,然后使用 c/continue
指令让程序执行到到下一个断点里面
最后我们发现成功进入 main
函数
如果开启了 PIE 以后,你会发现程序中的所有地址都是一个很小的数字,其实这只是一个偏移地址,然后这个程序的基地址其实是随机的。只有程序运行起来以后,地址才能被确定下来。