【发布时间】:2016-12-27 23:32:56
【问题描述】:
我有一个使用 fgets 从标准输入循环和读取的程序。整个读取循环位于一个函数中,我试图用 printf 漏洞覆盖函数的返回地址。返回地址位于 0xbffff0fc(即 0x2a20029e),堆栈上的缓冲区由输入 AAAA(0x41414141)标识。
0xbffff0b0: 0x0000000a 0x00000020 0xb7fc7c20 0xb7e4fd94
0xbffff0c0: 0xb7fc73cc 0xbffff0dc 0x41414141 0x66740000
0xbffff0d0: 0x785c2220 0x785c3439 0x785c3739 0x785c3430
0xbffff0e0: 0x29223830 0xb7fc0000 0x5da95700 0x00000000
0xbffff0f0: 0x00000000 0xb7fc7000 0x00000000 0x2a20029e
所以根据我的理解,我需要在缓冲区中写入 0xbffff0fc,然后我可以使用 %x%6$n(k 是整数)将任意值写入 0xbffff0fc。
所以输入看起来像这样:%x%6$n。我遇到的问题是如何编写 使其在堆栈上为 0xbffff0fc 。仅使用 ASCII 字符我无法真正做到这一点。
编辑:添加程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int function1()
{
char line[32];
size_t size;
while(1)
{
if (!fgets(line, sizeof(line), stdin))
{
return 0;
}
size = strlen(line);
line[size - 1] = '\0';
printf(line);
printf("\n");
}
return 0;
}
int main(int argc, char** argv)
{
function1();
return 0;
}
【问题讨论】:
-
我加了代码,真不觉得有必要出题。
标签: c security string-formatting