WaterDrop 战队2018护网杯线上赛Writeup
pwn
huwang
这题666那个选项就是我国赛出的题改了下……..说好的保护知识产权呢…….
伪条件竞争,可以把/tmp/secert
清空,然后进去之后就是rop
1 | from pwn import * |
shoppingCart
审计了一下,发现edit
那里有个下标溢出,可以修改第一个while
循环创建的那些结构
然后程序保护开得挺全的,那首先要leak出一个地址
leak
的方法是
- 创建两个
small bin chunk
- 删除第一个,这个时候第一个就进了
unsorted bin
- 创建一个
size
为0的chunk
,实际返回的是大小为0x18的chunk
,下面是截断的代码,因为read返回的是0,所以把size
位给置0了,这样就能leak到libc的基址1
*((_BYTE *)*v1 + (signed int)read(0, *v1, size) - 1) = 0;
第一个循环建立的结构大概如下1
2
3
4
5
6
7
8
9
10+--------------------+ +------------------------+ +----------------------+
| | | | | |
| A +---> | B +-------> | C |
| | | | | |
+--------------------+ +------------------------+ +----------------------+
BSS段 Heap BSS段
index: -17 index: -37
那个index是随便编的,大概理解就行
我们可以修改C的内容,让它指向libc中 main_arena
那里,为什么要指向那里呢? 因为那里的基本都是存着自身地址-0x10
的指针,依靠这个我们就可以达到任意写
1 | +---------------------+ +---------------------+ +--------------------+ |
怎么达到呢?
首先我们目前可以修改的是E的内容
我们可以再创建F,让它指向E,只要在E处填上我们想控制的地址就行
1 | +------------------+ +-----------------+ +-----------------+ |
最终的payload如下
1 | from pwn import * |
gettingstart
简单栈溢出覆盖变量的值
1 | from pwn import * |
web
easy_tornado
http://49.4.78.81:30299/error?msg=1
存在模板注入http://49.4.78.81:30299/error?msg=
获取 cookie_secret
由提示得 md5(cookie_secret + md5('/fllllllllllag'))
最后将 filename
改为 /fllllllllllag
,签名改为生成的 md5 值即可
crypto
Fez
化简可得 Result = ini_R ^ K1 ^ K2 ^ k4 ^ K5 + ini_L ^ ini_R ^ K0 ^ K2 ^ K3 ^ K5
设 x = K1 ^ K2 ^ k4 ^ K5 ; y = K0 ^ K2 ^ K3 ^ K5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# -*- coding:utf8 -*-
def xor(a,b):
assert len(a)==len(b)
c=""
for i in range(len(a)):
c+=chr(ord(a[i])^ord(b[i]))
return c
test = '0b7361c8143e5935f9f5be3949cc07ed7a5ba6f258ebd91f29c5a7d16976f8dfb7fa422a6167281e573d015cc6d995841d5cab07923c'
fez = 'f46d9ffa6a28a3fc2aa17c244ec29fc6a7bf5cac0da4489ad53782f1ef66597dc2928517b56693347ad468154e6f0f1ff8501fa6a1b1'
result = '44668860d4e23030bd4a0981530bc1d6da1a20f821aa51941258862cfb716cac503d0f0dcec150171aecfe4d86839f346ff26f2a6a70'
test = test.decode('hex')
fez = fez.decode('hex')
result = result.decode('hex')
x = xor(fez[0:27], test[27:54])
y = xor(xor(test[0:27], test[27:54]), fez[27:54])
R = xor(result[0:27], x)
L = xor(xor(result[27:54], R), y)
print L + R
misc
迟来的签到题
根据提示 xor1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# -*- coding:utf8 -*-
dic = {}
for i in range(0,26):
dic[chr(ord('A') + i)] = ord(chr(ord('A') + i)) - ord('A')
dic[chr(ord('a') + i)] = ord(chr(ord('a') + i)) - ord('a') + 26
for i in range(0,10):
dic[chr(ord('0') + i)] = ord(chr(ord('0') + i)) - ord('0') + 52
dic['+'] = 62
dic['/'] = 63
dic['='] = 0
s = 'AAoHAR1XICMnIlBfUlRXXyBXJFRSUCRRI1RSJyQkIlYgU1EjURs='
r = ''
for i in range(0, len(s)):
r += '{:06b}'.format(dic[s[i]])
for j in range(0, 128):
k = ''
for i in range(0, int(len(r)/8)):
t = int(r[i*8:i*8+8], 2)
p = t ^ j
k += chr(p)
if k.find('flag') != -1:
print(k)
break