比赛时间:2020-09-12 09:00:00- 17:00:00

签到题

本题考查西门子S7协议,发送题目给出的报文
0300002402f080320100000009000e00050501120a100100010000830000290003000101
会得到以上图中返回数据。

ICS1
通过Photoshop对二维码进行拼接,扫描得到flag。

ICS2
参考链接:(工控题目练习IDA(静态)之 恶意软件后门分析) https://www.dazhuanlan.com/2019/12/27/5e0506eeb86bc/

1、esp定律脱壳;
2、脱壳之后搜到“POST”字符串;
3、在post字符串那里下个断点,另其跑起来;
4、在栈窗口发现ip。

ICS3
使用binwalk提取squashfs-root系统 发现webroot下有腾达页面。
百度搜索腾达路由器 后门,得到以下链接。
参考链接:https://www.cnblogs.com/superpig0501/articles/3984727.html

ICS4
题目附件binwalk分离后得到一个压缩包,但是解压有密码。

但是在ICS_4的010 edit打开中,存在以下字符串,此字符串为压缩包解压密码。

解压后得到图片,用以下工具打开即可得到flag。

ICS8
参考链接:https://sumygg.com/2017/05/15/tsctf-2017-online-contest-write-up/index.html

import struct
import base64
cypher_text = 'HgoAVxEfdCRlPytBA1JSHiVOZW4VMURPcANETw=='
flag = 'xxxxxxxxxxxxxxxxxxx'
iv = struct.unpack("I", "x1a0")[0]
print ('iv is ', hex(iv))
def crypto(data):
return data ^ data >> 16
def encode(datas, iv):
cypher = []
datas_length = len(datas)
cypher += [crypto(datas[0] ^ iv)]
for i in range(1, datas_length):
cypher += [crypto(cypher[i-1] ^ datas[i])]
cyphertext = ''
for c in cypher:
cyphertext += struct.pack("I", c)
return base64.b64encode(cyphertext)
padding = 4 - len(flag) % 4
if padding != 0:
flag = flag + "x00" * padding
datas = struct.unpack("I" * (len(flag) / 4), flag)
print (encode(datas, iv))
def decode(cypher_text,iv):
cypher_text = base64.b64decode(cypher_text)
padding = 4 - len(cypher_text) % 4
if padding != 0:
cypher_text = cypher_text + "x00" * padding
l = cypher_text
crypher = struct.unpack("I"*(len(l)/4),l)
datas = []
datas += [ decrypto(crypher[0]) ^ iv ]
for i in range(1,len(crypher)):
datas += [decrypto(crypher[i]) ^ crypher[i-1]]
return datas
def decrypto(data):
return data ^ (data >> 16)
datas = decode(cypher_text,iv)
res = ""
for i in datas:
res += struct.pack("I",i)
print res

ICS9
参考链接:https://github.com/ctfs/write-ups-2015/tree/master/opentoall-ctf-2015/forensics/gone
flag:flag{ext_sooper_blocks_are_c00l}
ICS10
数字取证,找出flag
在线PDF转Word,如图:

打开Word将图片移开,即可看到flag。

ICS11

将len_fkey > 10 patch为 > 12,因为下面要与nemo_pwned_n比较
然后解方程,得到v16, v17

运行程序,改掉V16V17的值
可以得到flag
PatchDword(0x19FF28, 0x37346431)
PatchDword(0X19FF2C, 0x72336975)
print 'OK'

ICS12
参考链接:https://www.anquanke.com/post/id/146063?from=groupmessage

Flag:F1a9_is_I5cc_ZOl8_G3TP01NT
ICS13
参考链接:https://www.cnblogs.com/swustzww/p/8486268.html
Flag:EDHHIJKLMIE
解题过程:
放入IDA,从strlen测字符串长度的函数入手

分析过程
text:00401340 add esp, 0FFFFFFF4h
.text:00401343 lea eax, [ebp+Str]
.text:00401346 push eax ; Str
.text:00401347 call strlen //调用strlen
.text:0040134C add esp, 10h
.text:0040134F mov eax, eax //保存测试的字符串长度默认保存在eax
.text:00401351 lea edx, [eax-1] //将eax-1的值传入edx
.text:00401354 cmp [ebp+var_10], edx //前面已知ebp+var_10的值为0
.text:00401357 jb short loc_401360 //小于就跳转,跳转
.text:00401359 jmp short loc_401390
.text:00401359 ; ---------------------------------------------------------------------------
.text:0040135B align 10h
.text:00401360
.text:00401360 loc_401360: ; CODE XREF: DialogFunc+117j
.text:00401360 mov eax, [ebp+lpString]//分析ebp+lpString为我们输入的字符串的首地址
.text:00401363 mov edx, [ebp+var_10]
.text:00401366 add eax, edx
.text:00401368 movsx edx, byte ptr [eax]//将eax地址中的值的一字节移到edx,即字符串中的一个字符
.text:0040136B lea eax, [edx-14h]//字符的ascll码值减20
.text:0040136E lea edx, [ebp+Str] //将ebp+str的结果传给edx
.text:00401371 mov ecx, [ebp+var_10]
.text:00401374 movsx edx, byte ptr [ecx+edx]//取出str这个字符串中的一个字符,地址为(ecx+edx),str字符串已知为"10445678951"
.text:00401378 cmp eax, edx//比较是否相等
.text:0040137A jnz short loc_401389//不相等就跳转
.text:0040137C lea eax, [ebp+Str]
.text:0040137F mov edx, [ebp+var_10]
.text:00401382 mov byte ptr [edx+eax], 73h
.text:00401386 inc [ebp+var_34]//地址ebp+var_34地址里的值加1
.text:00401389
.text:00401389 loc_401389: ; CODE XREF: DialogFunc+13Aj
.text:00401389 inc [ebp+var_10]//地址ebp+var_10地址里的值加1.text:0040138C jmp short loc_401340
text:00401340 add esp, 0FFFFFFF4h
.text:00401343 lea eax, [ebp+Str]
.text:00401346 push eax ; Str
.text:00401347 call strlen //调用strlen
.text:0040134C add esp, 10h
.text:0040134F mov eax, eax //保存测试的字符串长度默认保存在eax
.text:00401351 lea edx, [eax-1] //将eax-1的值传入edx
.text:00401354 cmp [ebp+var_10], edx //前面已知ebp+var_10的值为0
.text:00401357 jb short loc_401360 //小于就跳转,跳转
.text:00401359 jmp short loc_401390
.text:00401359 ; ---------------------------------------------------------------------------
.text:0040135B align 10h
.text:00401360
.text:00401360 loc_401360: ; CODE XREF: DialogFunc+117j
.text:00401360 mov eax, [ebp+lpString]//分析ebp+lpString为我们输入的字符串的首地址
.text:00401363 mov edx, [ebp+var_10]
.text:00401366 add eax, edx
.text:00401368 movsx edx, byte ptr [eax]//将eax地址中的值的一字节移到edx,即字符串中的一个字符
.text:0040136B lea eax, [edx-14h]//字符的ascll码值减20
.text:0040136E lea edx, [ebp+Str] //将ebp+str的结果传给edx
.text:00401371 mov ecx, [ebp+var_10]
.text:00401374 movsx edx, byte ptr [ecx+edx]//取出str这个字符串中的一个字符,地址为(ecx+edx),str字符串已知为"10445678951"
.text:00401378 cmp eax, edx//比较是否相等
.text:0040137A jnz short loc_401389//不相等就跳转
.text:0040137C lea eax, [ebp+Str]
.text:0040137F mov edx, [ebp+var_10]
.text:00401382 mov byte ptr [edx+eax], 73h
.text:00401386 inc [ebp+var_34]//地址ebp+var_34地址里的值加1
.text:00401389
.text:00401389 loc_401389: ; CODE XREF: DialogFunc+13Aj
.text:00401389 inc [ebp+var_10]//地址ebp+var_10地址里的值加1.text:0040138C jmp short loc_401340
输入一个字符串,程序把输入的字符串与正确的字符串(10445678951)的长度进行比较,如果两个字符串长度相等,那么进行下一步,把输入的字符串逐个减20在于正确的字符串比较,若相等,匹配成功的个数加1,最后把匹配成功的个数与字符串长度比较,若相等,就输出corret
反向计算,所以应该输入的字符串为:”EDHHIJKLMIE”得到flag。
ICS14
打开程序,脱壳

发现一个方程,解密得到66, 90, 57, 100, 109, 113, 52, 99, 56, 103, 57, 71, 55, 98, 65, 89
然后转ASCII BZ9dmq4c8g9G7bAY
验证,flag正确

原文始发于微信公众号(Tide安全团队):“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp