我正在为缓冲区溢出攻击而对程序集进行珩磨。
机器规格:运行在虚拟盒中的kali linux 32位。
我正在运行这段代码
#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个字节..。但
此外,当我试图通过输入类似的东西(目标程序的ABCDABCDABCDABCDdesired地址)来重写返回地址时,它只是重写了所有的东西。
如果我尝试输入像\xab\xab这样的内容,它就会出现分段错误,尽管这仅仅是4个字节,并且应该非常适合8字节缓冲区。
提前谢谢你。
发布于 2020-06-04 21:12:05
在实际的缓冲区溢出攻击中,您永远不知道堆栈帧的大小。如果发现缓冲区溢出漏洞,则由您确定从缓冲区开始到返回地址的偏移量。把你的玩具例子像这样对待。
也就是说,堆栈框架的结构可以通过许多考虑因素来驱动。调用约定可能会调用特定的堆栈对齐。编译器可能会为自己的内部簿记创建不可见变量,这可能因编译器标志的不同而有所不同,例如优化级别。保存的调用方寄存器可能有一些空间,其数量是由函数本身的寄存器使用情况驱动的。甚至可能有一个保护变量专门用于检测缓冲区溢出。一般来说,除非编写编译器,否则不能单独从源推断堆栈帧结构。。。
发布于 2020-06-05 09:17:15
在分解getInput路由之后,结果发现额外的4个字节来自于出于某种原因将$ebx推到堆栈上的编译器。
在对各种有效负载进行测试之后,我似乎没有考虑在字符串末尾添加的欺骗性空字节。因此,我只需要添加一个额外的字节来减轻空字节的影响。
适当的有效载荷是:printf "AAAAAAAAAAAAA\xc9\x61\x55\x56" | ./test
https://stackoverflow.com/questions/62202162
复制相似问题