首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86组装函数栈

x86组装函数栈
EN

Stack Overflow用户
提问于 2020-06-04 18:55:40
回答 2查看 105关注 0票数 0

我正在为缓冲区溢出攻击而对程序集进行珩磨。

机器规格:运行在虚拟盒中的kali linux 32位。

我正在运行这段代码

代码语言:javascript
运行
复制
#include <stdio.h>

getinput(){

  char buffer[8]; //allocating 8 bytes
  gets(buffer); //read input
  puts(buffer); // print;

}

main() {

  getInput();
  return 0 ;
}

我的理解是,当函数getInput()被调用时,会发生以下情况:

1-将中下一条指令的地址推送到堆栈上。2- ebp寄存器被推到堆栈上。在堆栈上为缓冲区分配3-8字节。

总共16个字节..。但

As you can see in the image , just before reading the input in the function it shows a total of 24 bytes of the stack. specifically, i don't know why there is an extra 0x0000000 on the top of the stack

此外,当我试图通过输入类似的东西(目标程序的ABCDABCDABCDABCDdesired地址)来重写返回地址时,它只是重写了所有的东西。

如果我尝试输入像\xab\xab这样的内容,它就会出现分段错误,尽管这仅仅是4个字节,并且应该非常适合8字节缓冲区。

提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2020-06-04 21:12:05

在实际的缓冲区溢出攻击中,您永远不知道堆栈帧的大小。如果发现缓冲区溢出漏洞,则由您确定从缓冲区开始到返回地址的偏移量。把你的玩具例子像这样对待。

也就是说,堆栈框架的结构可以通过许多考虑因素来驱动。调用约定可能会调用特定的堆栈对齐。编译器可能会为自己的内部簿记创建不可见变量,这可能因编译器标志的不同而有所不同,例如优化级别。保存的调用方寄存器可能有一些空间,其数量是由函数本身的寄存器使用情况驱动的。甚至可能有一个保护变量专门用于检测缓冲区溢出。一般来说,除非编写编译器,否则不能单独从源推断堆栈帧结构。

票数 2
EN

Stack Overflow用户

发布于 2020-06-05 09:17:15

在分解getInput路由之后,结果发现额外的4个字节来自于出于某种原因将$ebx推到堆栈上的编译器。

在对各种有效负载进行测试之后,我似乎没有考虑在字符串末尾添加的欺骗性空字节。因此,我只需要添加一个额外的字节来减轻空字节的影响。

适当的有效载荷是:printf "AAAAAAAAAAAAA\xc9\x61\x55\x56" | ./test

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62202162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档