gpt4 book ai didi

linux - 使用 gdb 对指定可执行文件之外的单步汇编代码导致错误 "cannot find bounds of current function"

转载 作者:IT老高 更新时间:2023-10-28 12:25:28 35 4
gpt4 key购买 nike

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

其他细节:

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

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

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

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

最佳答案

运行 gdbtui,而不是 gdb。或者使用 -tui 开关运行 gdb。或者输入gdb后按C-x C-a。现在你在 GDB 的 TUI模式。

输入 layout asm 以制作上部窗口显示组件——这将自动跟随您的指令指针,尽管您也可以在调试时更改框架或滚动。按C-x s进入SingleKey模式,其中run continue up down finish等简写为一个键,让你快速浏览你的程序。

   +---------------------------------------------------------------------------+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/jconsoleReading symbols from /opt/j64-602/bin/jconsole...done.(no debugging symbols found)...done.(gdb) layout asm(gdb) start(gdb)

关于linux - 使用 gdb 对指定可执行文件之外的单步汇编代码导致错误 "cannot find bounds of current function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2420813/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com