XDCTF 2017 Writeup


快乐大巴战队的 WP 整合的一下发出来。 Misc 脑洞挺大的。其它方向有些 0 解的题也很迷。还是有很多东西要学。

RE

Destroy 300

首先对混淆的部分进行了修复过后可以看清楚 main 函数的逻辑 去花的部分可以参见 plusls 的文章

正确的输入需要通过 4012F0,401360,4013D0,401530 四个函数的检测,简单说一下逻辑。

  • 4012F0: 如果输入没有“.”则程序退出,否则根据“.”将输入分成三个部分
  • 401360: 第一个点之前的输入转换成数字后需同时满足三个式子,此处可以得到无数个解
  • 4013D0: 算法处理输入,将得到的结果存在内存中
  • 401530: 检查 4013D0 的结果,将其与“5D4A4759477D4C6836723437316E3B6E717A787E747F”匹配

flag 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
s = "5D4A4759477D4C6836723437316E3B6E717A787E747F"
s1 = '56451243'
flag = ''
for i in range(len(s)//2):
flag += chr(int(s[i*2:i*2 + 2], 16) - ord(s1[i % len(s1)]) + ord('0'))

s = "5D4A4759477D4C6836723437316E3B6E717A787E747F"
xdctf='XDCTF{'
for i in range(len(xdctf)):
print(int(s[i*2:i*2 + 2], 16) - ord(xdctf[i]))


for i in range(0, 10000):
a2 = int('56451' + str(i))
if a2 % 5 == 3 and a2 % 7 == 2 and a2 % 13 == 4:
print(a2)

flag: flag{He1l020l7klttys}


Web

web2 100

Python 代码在线编辑器 存在关键字过滤,可以使用 base64 编码绕过 列出当前目录文件: exec("aW1wb3J0IG9zO3ByaW50IG9zLmxpc3RkaXIob3MuZ2V0Y3dkKCkpOw==".decode('base64')) 看到一堆搅屎文件,自身 root 权限,怀疑 flag 被搅屎棍删了 查看 .bash_history 翻到许多 python /codes/hash/a.py 1>/codes/hash/yes 2>/codes/hash/err 猜想可能可以在 /codes/hash/yes 里翻到前人 cat flag.txt 的返回 结果在 codes 目录下直接找到了 flag


Misc

水表 100

下载得到两个 dump 文件 36 48,猜测文件名代表金额对应的卡内数据 对比发现第 25 行数据不同

1
2
36: 2400 0000 DBFF FFFF 7FA2 168F 0000 0000
48: 3000 0000 CFFF FFFF 7FA2 168F 0000 0000
相差的地方正好差 12 怀疑这两位是金额位 0x24+0xdb=0x30+0xcf=0xff 所以 DB 和 CF 估计是校验位 照这样估计 100RMB 这行的数据应该是 6400 0000 9BFF FFFF 7FA2 168F 0000 0000

flag: flag{649B}

邮箱 150

第 388 条 tcp 流是注册 WordPress 的流量,里面有正确的邮箱

flag: [email protected]

勒索病毒 150

在文件中解出一个 vb 脚本 但 64 位貌似不能跑 看源码像是个小游戏= =

找到执行vbs的程序即可

flag: wscript.exe

智能变电站 200

使用的协议标准是 IEC 61850-7-4,在TCP stream 13(27 也有) 去找国内这个标准的文档: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=129E5B67BB92475A23F977633E69E255 ,搜索报告控制块发现【保护】部分包括以下,经过尝试 flag 是 brcbRelayDin

flag: {brcbRelayDin}


Crypto

基础为王 100

流量包里找到两个图片 异或即可

flag: flag{Did u get the whole flag!}

基础之Base64 200

base64 隐写

解密代码

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
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res

def solve_stego():
with open('2.txt', 'rb') as f: # 2.txt为原题目txt
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i+8], 2))
print res_str

solve_stego()

flag: flag{8aseIsC0ol}