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代码。

ASM code for main funcion

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个低字节。这些字节是0x0D0x0A,CR和LF的代码,遗留系统使用的行终止符。

但是请注意,cookie应该初始化为0,因此cookie的高字节为0,并且程序也必须在禁用优化的情况下进行编译。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...