64位系统中的格式字符串漏洞利用

时间:2015-05-23 01:42:04

标签: linux security

我正在研究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这些页面每次都有不同的地址吗?

2 个答案:

答案 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中已经提到过此问题。知道如何规避这个问题吗?