我正在研究我的 64 位 ubuntu 14.04 机器上的格式字符串漏洞。
代码很简单:
#include <stdio.h>
int target = 0;
void vuln(char *buffer)
{
printf(buffer);
printf("%i", target);
}
int main(int argc, char **argv)
{
vuln(argv[1]);
}
我的最终目标是更改变量目标的值,但我卡在了第一步:找到字符串在内存中的偏移量。
我正在做的是:
./format2 `perl -e 'print "AAAAAAAA" . "%p."x500'` | grep 414141
有时字符串存在(我可以看到 41s 字符串),但有时不存在。所以我的问题是,字符串的偏移量不应该始终相同吗?
编辑:经过一些研究,我发现字符串存储在环境变量之前,内核为每个进程映射环境变量。可能是由于 ALSR,这些页面每次都有不同的地址?
最佳答案
如您所写,字符串存储在堆栈的开头,在其他一些值之后。 ASLR(地址空间布局随机化)不改变偏移量,它改变起点。
如果您想演示此漏洞,关闭 ASLR 是个好主意。
然而,似乎还有其他问题也在试图利用这个弱点。也就是说,您不能使用此方法将零写入内存,因为 printf 会将任何零视为字符串结尾并会停在那里。因此,您要写入的地址不能有前导零字节。 http://www.thenewsh.com/%7Enewsham/format-string-attacks.pdf 中已经提到了这个问题.知道如何规避这个问题吗?
关于linux - 64位系统格式化字符串漏洞利用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408045/