格式化字符串漏洞打补丁办法 patch


方法 —–> 替换printf 为puts

格式化字符串漏洞打补丁办法 patch

0x1 确定计算方法

由于地址是相对的 所以

新地址 = 目标地址(这里即为 puts的plt地址) - 当前修改指令地址的下一指令地址

0x02 确定目标地址

在plt 段 可以看到 puts_plt 地址为 0x08048410

格式化字符串漏洞打补丁办法 patch

0x03 确定当前地址

格式化字符串漏洞打补丁办法 patch

当前指令 call _printf的地址为 0x08048618 下一指令地址为 0x0804861D

0x04 计算

计算结果 如果为负数 记得补码~

1
2
3
4
5
6
7
8
9
>>> puts_plt = 0x8048410
>>> call_net_addr = 0x0804861d
>>> offset = puts_plt - call_next_addr
>>> offset
-525
>>> hex(offset)
'-0x20d'
>>> hex(0xffffffff-0x20d+1)
'0xfffffdf3L'

0x05 修改

Edit –> Patch Program –> Change Byte

格式化字符串漏洞打补丁办法 patch

E8 是操作码 后四位是偏移 即 又因为高字节在后面~

格式化字符串漏洞打补丁办法 patch

E8 C3 FD FF FF C7 04 24 72 87 04 08 E8 E7 FD FF

我们需要修改 C3 FD FF FF —> F3 FD FF FF

修改后 F5 伪代码~

格式化字符串漏洞打补丁办法 patch

0x06 保存

Edit –> Patch Program –> Apply patches to input file

格式化字符串漏洞打补丁办法 patch

运行情况~