“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

比赛时间: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

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安全团队