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

2024-04-15

我在 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(使用前将#替换为@)

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

随机推荐

  • 使用令牌 URI 获取证书 URI

    我正在尝试在 Ubuntu 上使用 USB 令牌来访问 VPN 此访问必须使用 openconnect 来完成 并在连接字符串中使用证书的 URI 但问题是 我不知道如何获取我的证书的 URI 我已经能够让 Ubuntu 识别该令牌 并且通
  • for 循环中的多个不同的事件侦听器

    下面的代码始终返回未定义 为什么是这样 我希望事件侦听器以索引字符串进行响应 Thanks var array Hey Hi Hello for var i 0 i lt array length i var box document cr
  • 如果我的应用程序处于活动状态,如何屏蔽主页键? (屏保、锁屏)

    如果我想写一个屏幕保护程序或锁屏 有没有办法防止home键返回到启动器 简单 当您进入活动时 调用 getWindow setType WindowManager LayoutParams TYPE KEYGUARD 当您退出活动时 请致电
  • 如果 2 个或更多人同时更新记录会发生什么?

    我使用 NHibernate 的版本属性 每次更新聚合根时该属性都会自动递增 如果 2 个或更多人同时更新同一条记录会发生什么 另外 我将如何测试这个 请注意 这不是我遇到过的情况 只是想知道 什么是原子的 什么不是 正如其他人所说 SQL
  • 为什么 :sprint 总是打印“_”?

    Prelude gt let a 3 Prelude gt sprint a a Prelude gt let c ab Prelude gt sprint c c 为什么总是打印一个 我不太明白的语义 sprint命令 Haskell 是
  • Gsub 获取 R 正则表达式中部分匹配的字符串?

    gsub a zA Z 0 9 5 1 htf84756 iuy 1 84756 iuy 我想获得84756 我该怎么办 Using gregexpr with regmatches 优点是只要求您的模式与您实际想要提取的位相匹配 stri
  • 原始类型的泛型(Int、Float、Double)会产生奇怪的错误消息

    这里有人可以看一下代码并告诉我它有什么问题吗 我本质上尝试构建几个对某些原始类型进行操作的通用函数 例如Int Float Double etc 不幸的是我无法让它正常工作 这是有效的代码 部分 http stackoverflow com
  • 以编程方式模拟平滑的拖动事件

    我用的是定制的拖动线性布局 https github com justasm DragLinearLayout 我添加的所有孩子都使用addDragView 可拖动 用户交互 我想模拟单击视图的拖动事件 平滑移动到布局底部 ACTION D
  • 有没有办法获取线程使用哪个核心?

    有没有办法获取线程使用哪个核心 例如 printf Core 2d n coreN 如果您使用的是基于 Linux 的系统 您可以使用 sched getcpu 打印线程正在运行的当前 CPU 核心数 cout lt lt Thread r
  • 是否可以在活动内启动活动?如何?

    活动A是主要的可见活动 我想开始活动B inside 活动A 并建立活动B in 框架布局 或类似的东西 的活动A 是否可以 如何 是的 您可以使用ActivityGroup并将其嵌入其中 http developer android co
  • Java 1.3 String.replaceAll() ,替换

    我正在和一些非常老的人一起工作Java 1 3准确地说 我正在尝试清理一些String通过删除非字母字符 标点符号和数字等 进行输入 通常我会做类似的事情 String replaceAll A Za z 然而 replaceAll 被介绍
  • c#:以 100% 质量保存 JPEG 时图像质量降低

    我只是加载 JPEG 图像并保存它 而不对其进行任何操作 但图像质量明显下降 这是代码 Bitmap imgOutput new Bitmap D image jpg Graphics outputGraphics Graphics Fro
  • SMS 是注册 Google App Engine 的唯一方式吗?

    我没有手机 但 Google App Engine 需要短信来验证帐户 还有其他方法可以完成注册吗 我很惊讶他们不使用 Gmail 帐户来执行此操作 编辑 谷歌为我创建了一个 问题解决了 否 如果您没有办法接收短信 您可以填写短信问题表格
  • 有没有办法在 Angular 2 中以可折叠格式显示有效的 json?

    有没有办法在 Angular 2 中以可折叠格式显示有效的 json pre data json pre 将很好地显示 json 但我需要能够折叠 展开其中的各个对象 尝试 ngx json viewer 它非常适合显示具有可展开 可折叠节
  • 向下滑动显示textview动画

    我有兴趣在我的 Android 应用程序中添加一个切换 TextView 可见性的动画 我希望它不只是将可见性设置为 Visibility GONE 和 Visibility VISIBLE 相反 我希望它具有类似 jquery 的幻灯片效
  • SessionId/身份验证令牌生成的最佳实践

    我见过有人使用 UUID 来生成身份验证令牌 然而 在RFC 4122 http www ietf org rfc rfc4122 txt据称 不要假设 UUID 很难猜测 不应该使用它们 作为安全功能 仅拥有即可授予的标识符 访问 例如
  • C - 我使用什么选项来生成列表文件?

    我是 C 编程语言和 gcc 的新手 我正在尝试破译一个相当复杂的 C 程序 我想阅读一个有用的列表文件而不是源文件 我正在寻找由 gcc 编译器创建的列表文件 其中包含 所有包含的源代码 xref 交叉引用列表 变量声明位置的引用 例如
  • Asp.Net Core API 禁用启动完成消息

    作为我的应用程序的一部分 我有一个 Net Core API 项目 与该项目作为自己的进程运行的大多数情况不同 我让 API 在线程等单个进程中运行 另外 对于我的项目 我实现了一个自定义日志系统来满足我的需求 但是 我遇到了一个小问题 每
  • 如何将accessibilityIdentifier设置为UIAlertController?

    这就是我简单创建的方式UIAlertController并将其呈现在屏幕上 private class func showAlertWithTitle title String message String let alert UIAler
  • 使用 gdb 在指定的可执行文件之外单步执行汇编代码会导致错误“无法找到当前函数的边界”

    我在 gdb 的目标可执行文件之外 甚至没有与该目标对应的堆栈 无论如何 我想单步执行 以便我可以验证汇编代码中发生了什么 因为我不是 x86 汇编方面的专家 不幸的是 gdb 拒绝进行这种简单的汇编级调试 它允许我设置并停止在适当的断点上