问题描述
我在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
,并且程序也必须在禁用优化的情况下进行编译。