一尘不染

使用gdb在指定的可执行文件之外单步执行汇编代码会导致错误“找不到当前函数的边界”

linux

我不在gdb的目标可执行文件之外,甚至没有对应于该目标的堆栈。无论如何,我都想单步执行,以便我可以验证汇编代码中发生的事情,因为我不是x86汇编方面的专家。不幸的是,gdb拒绝执行此简单的程序集级调试。它允许我在适当的断点处设置和停止,但是一旦我尝试单步执行,gdb就会报告错误“找不到当前函数的边界”,并且EIP不会更改。

额外细节:

机器代码是由gcc asm语句生成的,我从objdump
-d的输出将其复制到了正在执行的内核内存位置。我不介意使用加载程序将目标代码加载到重定位地址的简单方法,但是请记住,加载必须在内核模块中完成。

我想另一种选择是产生一个伪造的内核模块或调试信息文件以提供给gdb,使它相信该区域在程序代码内。gdb在内核可执行文件本身上运行良好。

(对于那些真正想知道的人,我是在运行时将代码插入VMware VM内的Linux内核数据空间中,然后通过VMware
Workstation的内置gdb存根从gdb远程调试内核进行调试。注意,我不是在编写内核漏洞;我是写原型的安全研究生。)

(我可以在程序集中的每条指令上设置一个断点。这可以工作,但是一段时间后会变得很费力,因为x86汇编指令的大小会有所不同,并且每次重新启动时,程序集的位置都会改变。)


阅读 299

收藏
2020-06-02

共1个答案

一尘不染

您可以使用stepinexti(可以缩写为sini)逐步浏览机器代码。

2020-06-02