-
-
[原创]看雪CTF.TSRC 2018 团队赛 第八题 二向箔 WP
-
发表于: 2018-12-18 14:59 1950
-
看雪CTF.TSRC 2018 团队赛 第八题 二向箔
做这个题,不需要识别fft,也不需要熟悉熟悉tea和aes等算法,只需用二元一次方程组解决复数除法和解GF2线性方程组即可,剩下全都是体力
先ida里F5一下
int sub_4027B0()
{
char v1; // [esp+0h] [ebp-130h]
int v2; // [esp+104h] [ebp-2Ch]
int v3; // [esp+108h] [ebp-28h]
int v4; // [esp+10Ch] [ebp-24h]
int v5; // [esp+110h] [ebp-20h]
int v6; // [esp+114h] [ebp-1Ch]
int v7; // [esp+118h] [ebp-18h]
int v8; // [esp+11Ch] [ebp-14h]
int v9; // [esp+120h] [ebp-10h]
int v10; // [esp+124h] [ebp-Ch]
char v11; // [esp+128h] [ebp-8h]
while ( 1 )
{
v2 = 0;
v3 = 0;
v4 = 0;
v5 = 0;
v6 = 0;
v7 = 0;
v8 = 0;
v9 = 0;
v10 = 0;
v11 = 0;
printf("\nInput RegCode:");
memset(&v1, 0, 0x101u);
scanf("%245s", &v1);
if ( sub_401650(&v1, &v2) == 36 && sub_401AC0((int)&v2) && sub_401710(&v6) )
break;
printf("\n Wrong, Plz Try Again...\n");
}
printf("\n Good!\n");
return sub_404B2E();
}
得到大致流程:
总输入长度72个字符转换成36个字节
检查前16字节:sub_401AC0
检查后20字节:sub_401710
sub_401AC0里面像是某种复数运算的相关算法,流程还算简单,算完后和固定数据比较,不需要知道这是什么算法,因为这个运算过程是可逆的,用到的都是复数的加减乘除运算,会解二元一次方程组即可还原复数,直接体力活逐段逆运算回去就行了,见代码中unchk1函数。
sub_401710里面稍微有些复杂:
1.sub_403A30->sub_4038E0->sub_403760是某种解密算法,解密出的20字节,最后4个字节是个长度,要求在13到16字节范围,是什么算法不重要,代码较短,花点时间逐行逆出来即可,见代码中tea_en。
2.sub_401330似乎是本题比较重要的部分了,要不然为啥单独这里面加了vm呢,函数有两个参数,一个参数是个长度为0xF0的固定数据key,另一个参数是前算法解密出的16字节数据,函数入口和出口分别有一段简单的4x4转置和xor操作,核心部分是中间会跳到vm中处理:
vm入口:
00401452 jmp loc_42C43D
vm出口:
00401501 sub dword ptr [ebp-28h], 10h
从00401452到00401501这段比较小的范围可以判断这中间没有几行代码,可能会call到其它函数,而其它函数没有发现有被vm的,而sub_401080在ida中是没有被参考的,
所以可以判断vm中call到了sub_401080,所以在sub_401080处下断点,先运行到vm入口处,把[ebp-14]处的16字节清0,然后运行到sub_401080断下来,观察[ebp-14]处的16字节发生变化,对比参数key的数据可以看出是对key中某一行的转置,再来一次把[ebp-14]处
的16字节全填FF,再观察就能猜出是与key中某一行的xor并转置,这些都是简单可逆的运算。
3.现在只剩下sub_401080了,这个函数把16字节的输入分成奇偶两组分别处理,先把它的实现还原出来,见代码中chk2_en函数(后面探测矩阵时要用到),看到这个函数里面只用了xor运算,所以尝试用GF2的64位线性方程组来解决,竟然有效,见代码中chk2_de2函数。
最终得到完整结果:
76474B2B1926009C452B00627200190268740438FDCC641665D0EA735F2739B3EE7B315A
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
谁下载
看原图
赞赏
雪币:
留言: