- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
正如标题所说,我正在尝试获取框架中存储的EIP的地址。对于这个简单的程序:
func1(int a, int b)
{
int x = 1;
}
int main(void)
{
func1(1,2);
}
我的 gdb 反汇编是:
(gdb) disassemble main
Dump of assembler code for function main:
0x08048430 <main+0>: push %ebp
0x08048431 <main+1>: mov %esp,%ebp
0x08048433 <main+3>: sub $0x8,%esp
0x08048436 <main+6>: add $0xfffffff8,%esp
0x08048439 <main+9>: push $0x2
0x0804843b <main+11>: push $0x1
0x0804843d <main+13>: call 0x8048410 <func1>
0x08048442 <main+18>: add $0x10,%esp
0x08048445 <main+21>: mov %ebp,%esp
0x08048447 <main+23>: pop %ebp
0x08048448 <main+24>: ret
End of assembler dump.
从 GDB 打印的栈帧:
(gdb) info frame
Stack level 0, frame at 0xffbfdda0:
eip = 0x8048416 in func1 (t.c:3); saved eip 0x8048442
called by frame at 0xffbfddc0
source language c.
Arglist at 0xffbfdd98, args: a=1, b=2
Locals at 0xffbfdd98, Previous frame's sp is 0xffbfdda0
Saved registers:
ebp at 0xffbfdd98, eip at 0xffbfdd9c
info frame不提供保存eip的地址,只是显示保存eip的值。
我在 func1 上设置了一个断点,然后打印了帧信息。保存的EIP值为0x8048442,对应反汇编中的。我很困惑,如何计算EIP(0x8048442)所在的地址?
我已经检查了地址 0x8048412(0x8048416 - 4),但它不包含保存的 EIP 地址。
最佳答案
您需要检查arg 列表 之前的区域。它告诉您:eip at 0xffbfdd9c
。
此地址在 arg 列表之前 4 个字节 - 0xffbfdd98
。请记住,列表向下增长,因此“x 之前的 4 个字节”表示“x+4”。
saved eip 0x8048442
信息是关于EIP指向哪里的,在文本部分,不在栈中。
关于c - 如何计算存储的EIP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847979/
我的程序在 Windows Vista Ultimate 和 Windows 7 上运行完美,但在 Windows XP 上运行失败。 首先,我的应用程序创建一个系统文件进程,它调用 GetThrea
我正在尝试利用该程序中的缓冲区溢出我使用的是 32 位 kali_linux #include void win() { printf("code flow successfully changed
我想编写一个易受攻击的程序,以更好地理解 c# 中的 Stack Overflow(原因),也用于教育目的。基本上,我“只是”想要一个堆栈溢出,覆盖 EIP,所以我可以控制它并可以指向我自己的代码。我
嗨,我真的陷入了这个问题:这是我的代码,下面是我尝试溢出的代码: #include #define B 145 // 141 for ex overflow #define A 0 char sc[
在Spring Integration我需要按顺序将消息发送到子流 A(它将消息存储到数据库中),然后再发送到子流 B(它使用一些数据库查找)。整个 A 和 B 执行应该在一个事务的边界内执行。 最初
我正试图通过更改它的 EIP 来破解另一个程序。有两个程序在运行,一个是目标,它告诉函数“核心函数”(例如,接收密码字符串作为参数并返回 true 或 false 的函数)在内存中的位置。然后现在我知
eip 寄存器是 32 位,每条新指令都会递增。那么当它达到 32 位数字的最大值时会发生什么:4294967295。 最佳答案 通常,您不会让它发生。 %eip 不会无条件递增;它受流控制指令(如
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: use callback function to report stack backtrace 给定一个 void
我最近一直在编写一些内核模块。对于某些模块,每次插入或删除它们时,屏幕上都会显示巨大的内核跟踪。错误有点像 ERROR: Bad EIP value. 或 ModuleName is tainted
我有一个 Camel 路由,它从队列中取出一条消息,将它发送到一个 bean 进行处理,然后将消息排回另一个队列。 我正在尝试消除第二个队列中的“重复消息”。 Camel 是否有任何端点、处理器、EI
我正在尝试解决缓冲区溢出问题。我不明白这里的 eip 值是怎么回事。 这是 C 代码: void copy(char *arg) { char msg[256]; strcpy(msg,arg
这个问题看起来像是一个肮脏的 hack,你不应该这样做,但让我先解释一下。最终目标是像 C++ 中那样拥有方法局部静态。 void Func() { static methodLocalObje
我在 ubuntu 12.04 和 64 位机器上工作。我在读一本关于缓冲区溢出的好书,在玩一个例子时发现了一个奇怪的时刻。 我有这个非常简单的 C 代码: void getInput (void)
在 x86 架构中的函数调用期间,是否存在返回地址未压入堆栈的情况? 最佳答案 号CALL根据定义,将在跳转到目标地址之前将返回地址压入堆栈。那个返回地址是 EIP (或 RIP)+ sizeof(c
我有一个 CloudFormation 模板,它为 RStudio Server 启动了一个 EC2 实例。 AWSTemplateFormatVersion: 2010-09-09 Descript
在处理一些 x86 asm 时,我想知道错误导致 EIP 被设置为 00000000 或另一个不存在的内存位置的情况。是否可以使用 SEH 或类似的错误处理机制捕获这些情况并恢复执行? (假设堆栈、堆
对于计算机体系结构和处理器/内存级别发生的低级内容,我完全是新手。我首先要说的是。我对计算机所做的工作几乎一直处于高级编程水平。 C++、Java等话虽这么说,我目前正在读一本开始深入研究低级编程内容
我(也许过于简单)对 EJB3 的理解是,它是一种将 POJO 转变为符合 Java EE 的业务逻辑单元的方法。它是可重用的,可以“插入”到跨越多个项目的不同后端架构。这是朝着真正的组件驱动架构方向
我正在尝试开发运行时堆栈跟踪器。我有一个函数,只要被跟踪的程序出现段错误,它就会返回 EIP 地址。我怎样才能回到当前函数的 ebp(被观察程序崩溃的那个函数),以便我可以开始跟踪? 最佳答案 无法将
我正在使用 Apache Camel 2.15 并发现了一个有趣的行为。我将通过 REST API 调用接收到的数据放入作为直接端点的 Camel 路由中。该路由又使用拆分的 EIP 并调用另一个也是
我是一名优秀的程序员,十分优秀!