- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试解决缓冲区溢出问题。我不明白这里的 eip 值是怎么回事。
这是 C 代码:
void copy(char *arg) {
char msg[256];
strcpy(msg,arg);
}
它的程序集:
0x804847d <copy+25>: call 0x8048368 <strcpy@plt>
0x8048482 <copy+30>: leave
0x8048483 <copy+31>: ret
我输入一个字符串作为参数,如“_\xAA\xBB\xCC\xDD”,其大小经过计算,因此最后 4 个字节为 4 个字节在 $ebp 之后(为了覆盖真实的返回地址)。它似乎有效。
在 gdb 中:
(break before strcpy)
x/2wx $ebp
0xbffffb38: 0xbffffb58 0x080484d2
n
(just after strcpy execution)
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
...
n
...
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
所以返回地址是0x080484d2
,溢出后是0x080484b6
,这就是我想要的。但程序退出:“无法访问地址 0x80cdd18d 处的内存”。
我不知道为什么 $eip 没有设置到我的地址,而且因为 0x08048 中的代码地址......我非常有信心 $ebp+4 是包含返回地址的地方
我再次尝试使用一个小 4 个字节的字符串,这次它覆盖了 $ebp 而不是 $ebp+4,返回后 $eip 被设置为 $ebp+4 中包含的值
有什么解释吗?
最佳答案
好的,谢谢@Wumpus Q. Wumbley,这帮助我理解了一些事情。
执行next
会跳转leave
和ret
。 ret
是改变eip
的指令,它必须等价于pop eip
。但是 leave
修改了堆栈指针 esp
和 ebp
之前(特别是因为当我覆盖 ebp+4 时我改变了 ebp 中包含的值)
TLDR:不覆盖 ebp 的值使其成功运行。
关于c - 为什么在这次缓冲区溢出尝试中 eip 没有改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19756602/
我的程序在 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 并调用另一个也是
我是一名优秀的程序员,十分优秀!