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

  • A+
所属分类:逆向工程

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

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

签到题

“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp
本题考查西门子S7协议,发送题目给出的报文

0300002402f080320100000009000e00050501120a100100010000830000290003000101

会得到以上图中返回数据。

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

ICS1

通过Photoshop对二维码进行拼接,扫描得到flag。
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

ICS2

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

“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp
1、esp定律脱壳;
2、脱壳之后搜到“POST”字符串;
3、在post字符串那里下个断点,另其跑起来;
4、在栈窗口发现ip。
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

ICS3

使用binwalk提取squashfs-root系统 发现webroot下有腾达页面。

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


百度搜索腾达路由器 后门,得到以下链接。


参考链接:https://www.cnblogs.com/superpig0501/articles/3984727.html
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

ICS4

题目附件binwalk分离后得到一个压缩包,但是解压有密码。
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp
但是在ICS_4的010 edit打开中,存在以下字符串,此字符串为压缩包解压密码。
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp
解压后得到图片,用以下工具打开即可得到flag。
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

ICS8

参考链接:https://sumygg.com/2017/05/15/tsctf-2017-online-contest-write-up/index.html
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

import structimport 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) % 4if 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


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

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,如图:
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp
打开Word将图片移开,即可看到flag。
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp

ICS11

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


将len_fkey > 10 patch为 > 12,因为下面要与nemo_pwned_n比较


然后解方程,得到v16, v17


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


运行程序,改掉V16V17的值


可以得到flag


PatchDword(0x19FF28, 0x37346431)
PatchDword(0X19FF2C, 0x72336975)
print 'OK'


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

ICS12

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


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


Flag:F1a9_is_I5cc_ZOl8_G3TP01NT

ICS13

参考链接:https://www.cnblogs.com/swustzww/p/8486268.html


Flag:EDHHIJKLMIE


解题过程:
放入IDA,从strlen测字符串长度的函数入手


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


分析过程

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

打开程序,脱壳
“中能融合杯”全国第六届工控系统信息安全攻防竞赛Wp


发现一个方程,解密得到66, 90, 57, 100, 109, 113, 52, 99, 56, 103, 57, 71, 55, 98, 65, 89


然后转ASCII BZ9dmq4c8g9G7bAY


验证,flag正确


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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: