工控逆向分析类题目在工控安全竞赛中属于难度最大类的题目,一般考察选手对工控组态编程调试的熟悉技巧,以及加密解密,程序逆向分析等技巧。在各类工控比赛中出场率较高,一般属于压轴型题目出现,分值较高,解题人数一般较少。因此该类题目一旦解决,很大程度决定了在大赛上取得较高分值,拿到名次。本文会结合往届工控比赛中的真题对工控逆向进行分析,分享工控组态调试分析技巧、程序逆向技巧。
博途V16打开文件后进行PLC编程,查看项目视图:
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。
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"char* RC4(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;}unsignedchar* HexToByte(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):工业控制系统应用程序逆向分析技术
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论