我在 gdb 的目标可执行文件之外,甚至没有与该目标对应的堆栈。无论如何,我想单步执行,以便我可以验证汇编代码中发生了什么,因为我不是 x86 汇编方面的专家。不幸的是,gdb 拒绝进行这种简单的汇编级调试。它允许我设置并停止在适当的断点上,但是一旦我尝试单步前进,gdb 就会报告错误“无法找到当前函数的边界”,并且 EIP 不会更改。
额外细节:
机器代码是由 gcc asm 语句生成的,我从 objdump -d 的输出将其复制到它正在执行的内核内存位置。我不介意使用加载器将目标代码加载到重定位地址的简单方法,但请记住加载必须在内核模块中完成。
我想另一种选择是生成一个假内核模块或调试信息文件以提供给 gdb,使其相信该区域位于程序代码内。 gdb 在内核可执行文件本身上运行良好。
(对于那些真正想知道的人,我在运行时将代码插入到 VMware VM 内的 Linux 内核数据空间中,并通过 VMware Workstation 的内置 gdb 存根从 gdb 远程调试内核进行调试。注意,我不是在编写内核漏洞利用;我是一名正在编写原型的安全研究生。)
(我可以在程序集中的每条指令上设置一个断点。这可以工作,但一段时间后会变得非常费力,因为 x86 程序集指令的大小各不相同,并且每次重新启动时程序集的位置都会改变。)
Instead of gdb
, run gdbtui
. Or run gdb
with the -tui
switch. Or press C-x C-a after entering gdb
. Now you're in GDB's TUI http://sourceware.org/gdb/current/onlinedocs/gdb/TUI.html mode.
Enter layout asm
to make the upper window display assembly -- this will automatically follow your instruction pointer, although you can also change frames or scroll around while debugging. Press C-x s to enter SingleKey mode, where run continue up down finish
etc. are abbreviated to a single key, allowing you to walk through your program very quickly.
+---------------------------------------------------------------------------+
B+>|0x402670 <main> push %r15 |
|0x402672 <main+2> mov %edi,%r15d |
|0x402675 <main+5> push %r14 |
|0x402677 <main+7> push %r13 |
|0x402679 <main+9> mov %rsi,%r13 |
|0x40267c <main+12> push %r12 |
|0x40267e <main+14> push %rbp |
|0x40267f <main+15> push %rbx |
|0x402680 <main+16> sub $0x438,%rsp |
|0x402687 <main+23> mov (%rsi),%rdi |
|0x40268a <main+26> movq $0x402a10,0x400(%rsp) |
|0x402696 <main+38> movq $0x0,0x408(%rsp) |
|0x4026a2 <main+50> movq $0x402510,0x410(%rsp) |
+---------------------------------------------------------------------------+
child process 21518 In: main Line: ?? PC: 0x402670
(gdb) file /opt/j64-602/bin/jconsole
Reading symbols from /opt/j64-602/bin/jconsole...done.
(no debugging symbols found)...done.
(gdb) layout asm
(gdb) start
(gdb)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)