我正在研究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这些页面每次都有不同的地址吗?答案 0 :(得分:0)
我认为我没有解决所有问题,但我的更改可能对您有所帮助:
#include <stdio.h>
int target = 0;
void vuln(int buffer)
{
//printf(buffer);
printf("%d \n", target);
target = buffer;
}
int main(int argc, char **argv)
{
vuln(1);
printf("%d\n", target);
}
答案 1 :(得分:0)
正如您所写,字符串存储在堆栈的开头,在其他一些值之后。 ASLR(地址空间布局随机化)不会改变偏移量,它会改变起始点。
如果您想展示此漏洞,请关闭ASLR是个好主意。
然而,似乎还有其他问题试图利用这个弱点。也就是说,你不能用这种方法将零写入内存,因为printf会将任何零视为字符串结尾并停在那里。因此,要写入的地址不得包含前导零字节。 http://www.thenewsh.com/%7Enewsham/format-string-attacks.pdf中已经提到过此问题。知道如何规避这个问题吗?