格式化字符串
覆盖栈内存
通过%n
将指定个数写入相应地址。
覆盖任意内存
修改为小数字
通过前面我们可以发现,如果用%n
的话,你输入的地址都会被计算在内。如果我想修改数值为2的话,哪怕是32位的地址都直接占用4个字节了,肯定无法写入2。
所以其实,我们没有必要老老实实让printf去指定我们(比如说)第6个地址写入%n
个数值,我们可以用%8$n
去指定printf去第八个位置寻找(因为我们的格式化字符串就占用8个字节了,可以用aa来凑字节。)
修改为大数字
使用%hhn
精确控制希望修改的字节(这是通用方法,所有都可以这样子做)
附上我的美图,帮助各位理解为什么要padding这些字节:
本文来自博客园,作者:muyiGin,转载请注明原文链接:https://www.cnblogs.com/muyiGin/p/18378088