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

  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 无法在 R 中安装插入符号包(在我的 Linux 机器中)

    我在尝试在 R 中安装插入符号包时遇到以下错误 g error tmp Rtmp2Tos7n R INSTALL2e6e30153a74 nloptr nlopt 2 4 2 lib libnlopt cxx a No such file
  • MYSQL插入GB大小的巨大SQL文件

    我正在尝试创建 Wikipedia DB 副本 大约 50GB 但在处理最大的 SQL 文件时遇到问题 我使用 linux split 实用程序将 GB 大小的文件拆分为 300 MB 的块 例如 split d l 50 enwiki 2
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 使用 WGET 运行 cronjob PHP

    我尝试执行一个 cron 并每 5 分钟运行一个 url 我尝试使用 WGET 但我不想下载服务器上的文件 我只想运行它 这是我使用的 crontab 5 wget http www example com cronit php 除了 wg
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 内存地址是否指向一个字节的信息?

    以下是 DTS 文件的摘录 linux arch powerpc boot dts 板名 dts memory device type memory reg lt 0x00000000 0x40000000 gt 1GB at 0 嵌入式设
  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 让“git pull”在拉取不同分支时要求确认

    当同时处理许多项目和分支时 我偶尔会犯一些愚蠢的错误 比如拉入错误的分支 例如在分支上master I did git pull origin dangerous code并且有一段时间没有注意到这一点 这个小错误造成了很大的混乱 当我尝试
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • Linux下的C#,Process.Start()异常“没有这样的文件或目录”

    我在使用 Process 类调用程序来启动程序时遇到问题 可执行文件的层次结构位于 bin 目录下 而当前工作目录需要位于 lib 目录下 project bin a out this is what I need to call lib

随机推荐

  • 使用令牌 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 拒绝进行这种简单的汇编级调试 它允许我设置并停止在适当的断点上