【发布时间】:2018-12-12 15:40:52
【问题描述】:
我想使用格式字符串漏洞(特别是 sprintf)将整数 1 写入地址 0x08049940
这就是函数的样子
void greet(char *s) {
char buf[666];
sprintf(buf, "Hello %s!\n", s);
printf(buf);
}
我尝试了多个教程,但我相信它们不起作用,因为我的字符串已经以“Hello”开头。所以我尝试使用输入开始写更低
%.1%n\x39\x99\x04\x08
低 7 个值,以及原始地址附近的其他地址。然而我的 gdb 调试器一直告诉我 0x08049940 上的地址仍然是代码中指定的默认地址。
【问题讨论】:
-
我没有看到它应该如何产生格式字符串攻击。这种攻击通常围绕程序使用用户输入作为格式字符串。即使我们假设
"Hello %s!\n"代表用户输入,这种攻击也取决于用户提供的格式字符串,其中包含与其余实际参数不匹配的格式指令,而您的示例中并非如此。 -
@4386427 它不应该溢出缓冲区。它应该写到一个特定的地址
-
@4386427 如果
s(+"Hello ") 比buf长,它会溢出。但这绝对不是格式刺攻击,而是堆栈溢出。 -
此外,对
printf-family 函数之一的格式字符串攻击最容易用于提取数据,而不是修改它。我真的完全看不出您希望如何通过您提供的任何东西来修改特定地址的数据。 -
@4386427 对,使用特定输入不会。如果被
\0终止当然...