方法 —–> 替换printf 为puts
0x1 确定计算方法
由于地址是相对的 所以
新地址 = 目标地址(这里即为 puts的plt地址) - 当前修改指令地址的下一指令地址
0x02 确定目标地址
在plt 段 可以看到 puts_plt 地址为 0x08048410
0x03 确定当前地址
当前指令 call _printf
的地址为 0x08048618 下一指令地址为 0x0804861D
0x04 计算
计算结果 如果为负数 记得补码~
1 2 3 4 5 6 7 8 9 | 0x8048410 puts_plt = 0x0804861d call_net_addr = offset = puts_plt - call_next_addr offset-525 hex(offset)'-0x20d' 0xffffffff-0x20d+1) hex('0xfffffdf3L' |
0x05 修改
Edit –> Patch Program –> Change Byte
E8 是操作码 后四位是偏移 即 又因为高字节在后面~
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 伪代码~
0x06 保存
Edit –> Patch Program –> Apply patches to input file
运行情况~