linux - 64位系统格式化字符串漏洞利用

标签 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,这些页面每次都有不同的地址?

最佳答案

如您所写,字符串存储在堆栈的开头,在其他一些值之后。 ASLR(地址空间布局随机化)不改变偏移量,它改变起点。

如果您想演示此漏洞,关闭 ASLR 是个好主意。

然而,似乎还有其他问题也在试图利用这个弱点。也就是说,您不能使用此方法将零写入内存,因为 printf 会将任何零视为字符串结尾并会停在那里。因此,您要写入的地址不能有前导零字节。 http://www.thenewsh.com/%7Enewsham/format-string-attacks.pdf 中已经提到了这个问题.知道如何规避这个问题吗?

关于linux - 64位系统格式化字符串漏洞利用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408045/

相关文章:

linux - 使用 sed,行切割提取 sql 插入

linux - "Can' t open *.sh"启动时的消息

linux - 在数据文件中查找唯一值

javascript - 在 JSON 和安全性中注入(inject) javascript

java - 方法 kpg.initialization 中的 Android 空指针异常

security - Firefox或Chrome插件可阻止和过滤所有传出连接

ios - 如何在 iOS 中安全地存储私钥?

linux - 这些获取资源使用情况的方法有什么区别?

javascript - 安全性:innerHTML 与 textContent 与 API

arrays - bash脚本在expect代码中增加数组索引