工业控制系统应用程序逆向分析技术

admin 2025年5月22日16:52:55评论1 views字数 2435阅读8分7秒阅读模式

工控逆向分析类题目在工控安全竞赛中属于难度最大类的题目,一般考察选手对工控组态编程调试的熟悉技巧,以及加密解密,程序逆向分析等技巧。在各类工控比赛中出场率较高,一般属于压轴型题目出现,分值较高,解题人数一般较少。因此该类题目一旦解决,很大程度决定了在大赛上取得较高分值,拿到名次。本文会结合往届工控比赛中的真题对工控逆向进行分析,分享工控组态调试分析技巧、程序逆向技巧。

工控系统中的黑客-程序逆向
题目描述:黑客入侵工控厂区,成功拿到了工控项目以及加密文件,通过其他方式获取到其中 b = 12 、c= 1512 、d = 115,都跟flagkey密切相关,根据得到的flagkey 求得最终的flag。
首先查看题目文件结构,后缀为 .ap16文件,为博途工程项目文件。
工业控制系统应用程序逆向分析技术

博途V16打开文件后进行PLC编程,查看项目视图:

工业控制系统应用程序逆向分析技术
选择 Main组织块 进行查看组态程序,发现其主要调用了 FC2 块2,具体程序如下:
工业控制系统应用程序逆向分析技术
对组态进行下载,先启动西门子模拟器之后进行装载:
工业控制系统应用程序逆向分析技术
正常下载后,程序无报错即可进行监视。
工业控制系统应用程序逆向分析技术
程序中的这个常开开关要修改为1 延时等待3s。
工业控制系统应用程序逆向分析技术
在程序块中看到程序对应数据:
工业控制系统应用程序逆向分析技术
将其值进行修改,
工业控制系统应用程序逆向分析技术
因此整个组态程序要满足以下条件:
1.key要满足条件 key1 要等于 string 类型的 'key1'
2.a已有初始值12 ,b的值按照题目描述为 12 ,c的值按照题目描述为 1512 ,d的值按照题目描述为115 ,计算加法得到 v的值 1582
工业控制系统应用程序逆向分析技术

3.v中求得的1651 带入 和 已知 mo 值为 2 即计算1651 除以 2 的值 为 825 

4.接着执行 (31+12)*(2+825 ) 最终得到 35561

工业控制系统应用程序逆向分析技术

5.35561 进行求平方根 ,得到189 (四舍五入进位,以程序计算结果为准)

工业控制系统应用程序逆向分析技术

6.接着对已经得到的 189 与 31相乘 得到 5859 

工业控制系统应用程序逆向分析技术

7.继续做乘法得到70308 

8.最后进行加法计算 得到901304331,即为题目要求的flagkey。

工业控制系统应用程序逆向分析技术
这里已经满足题目要求的第一步,接着对两个exe程序进行求解。
查看对应二进制文件的PE格式。
工业控制系统应用程序逆向分析技术

Exeinfo查壳发现区段被更改,魔改了UPX,使用脱壳机发现失败了,

工业控制系统应用程序逆向分析技术
那就进行手动脱壳。
工业控制系统应用程序逆向分析技术

找到程序原始OEP,DUMP出来并进行修复。

工业控制系统应用程序逆向分析技术

之后放入IDA中进行分析

工业控制系统应用程序逆向分析技术

第一个输入很明显是我们上面解开的key,下面也就是我们需要输入的flag,算法特征是个RC4。

工业控制系统应用程序逆向分析技术

这里跟我们的密文进行了比较,发现常规的RC4解不出这个密文。

工业控制系统应用程序逆向分析技术

再逆向审计代码。

工业控制系统应用程序逆向分析技术

发现程序中将RC4的密钥流被魔改了,那么我们还原即可。

写出对应CPP代码。

#include<iostream>#include<string.h>usingnamespacestd;#include<fstream>#include<stdint.h>#include<string.h>#include<stdio.h>extern"C"charRC4(char* C, char* key){int S[256];int T[256];int count = 0;    count = strlen(key);for (int i = 0; i < 256; i++)    {        S[i] = i;int tmp = i % count;        T[i] = key[tmp];    }int j = 0;for (int i = 0; i < 256; i++)    {        j = (j + S[i] + T[i]) % 256;int tmp;        tmp = S[j];        S[j] ^= S[i];//        S[i] ^= tmp;//    }int length = 0;    length = strlen(C);int i;    i = 0, j = 0;for (int p = 0; p < length; p++)    {        i = (i + 1) % 256;        j = (j + S[i]) % 256;int tmp;        tmp = S[j];        S[j] = S[i];        S[i] = tmp;int k = S[(S[i] + S[j]) % 256];        C

= C

^ k;    }return C;}unsignedcharHexToByte(constchar* szHex){if (!szHex)returnNULL;int iLen = strlen(szHex);if (iLen <= 0 || 0 != iLen % 2)returnNULL;unsignedchar* pbBuf = newunsignedchar[iLen / 2];  int tmp1, tmp2;for (int i = 0; i < iLen / 2; i++)    {        tmp1 = (int)szHex[i * 2] - (((int)szHex[i * 2] >= 'A') ? 'A' - 10 : '0');if (tmp1 >= 16)returnNULL;        tmp2 = (int)szHex[i * 2 + 1] - (((int)szHex[i * 2 + 1] >= 'A') ? 'A' - 10 : '0');if (tmp2 >= 16)returnNULL;        pbBuf[i] = (tmp1 * 16 + tmp2);    }return pbBuf;}intmain(){char* cccc = "257DFD207BAEE3215BC3647BE277F360F81E40AAFF894E087017C3";char* a = "901304331";char* aaaaa = (char*)HexToByte(cccc);   RC4(aaaaa, a);cout <<aaaaa;}

运行得到flag。

工业控制系统应用程序逆向分析技术

因此最终答案:flag{th1s_1s_fl4g_ha6e_f7n} 

总结
本文分析了工控比赛中难度较大的一类题目,题目考点包含工控程序组态程序分析,软件逆向调试技巧,加密解密算法,综合考点较多,是未来工控安全竞赛中的一个重要命题方向。

原文始发于微信公众号(SAINTSEC):工业控制系统应用程序逆向分析技术

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月22日16:52:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   工业控制系统应用程序逆向分析技术https://cn-sec.com/archives/4090008.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息