ezprocess

将提供的压缩包解压出来,得到两个exe文件
进程执行.exe 和 another.exe
常规拖入ida中看看情况
image.png
这是进程执行那个文件的反编译情况,有几个看点,qmemcpy函数 和Createprocessw函数,一个明显跟key有关,你一个创建了一个新的进程,
qmemcpy将那一长串字符串存入source中,然后通过一个for循环操作,python中得到的脚本

1
2
3
4
flag=']]//]]Efcvh]]bopuifs/fyf!EBTDUG|Z1v(w4`cf4o`us2dl4e"~'
for i in range(len(flag)):
print(chr(ord(flag[i])-1),end="")

得到\..\Debug\another.exe DASCTF{Y0u’v3_be3n_tr1ck3d!},剩下的代码不用看了,调用了another.exe 并且传入了DASCTF{Y0u’v3_be3n_tr1ck3d!}(不是flag)作为参数,接下来看看another
image.png
得到反编译结果后,很快发现有right和wrong,说明判断函数就在这里,仔细看看会发现有个crflag[ii]==enflag[ii]的if语句,再从前面发现了crflag[m]=flag[xb[m]],和key[j]=argv[1][j],
有几个关键字符串key,enflag->crflag,xb[]->flag
key前面已经得到了key=”DASCTF{Y0u’v3_be3n_tr1ck3d!}”
enflag=”77h, 0, 72h, 17h, 0Bh, 34h, 13h, 69h, 6Fh, 21h, 54h, 45h, 6Ch, 3Eh, 3Dh, 16h, 5Ah, 3Dh, 30h, 0Dh, 11h, 61h, 30h, 4Ah, 70h, 1Fh, 52h, 39h, 2, 4, 2Eh, 10h”
由此我们可以得到crflag

1
2
3
4
5
6
7
8
key="DASCTF{Y0u'v3_be3n_tr1ck3d!}"
enflag=[0x77, 0x0, 0x72, 0x17, 0x0B, 0x34, 0x13, 0x69, 0x6F, 0x21, 0x54, 0x45, 0x6C, 0x3E, 0x3D, 0x16, 0x5A, 0x3D, 0x30, 0x0D, 0x11, 0x61, 0x30, 0x4A, 0x70, 0x1F, 0x52, 0x39, 0x2, 0x4, 0x2E, 0x10]
crflag=[]
for i in range(32):
a=key[i%len(key)]
crflag.append(enflag[i]^ord(a))
print(chr(crflag[i]),end="")

结果是3A!T_rh0_Ts3_a_siSoycPS!C{sDFE}S
最后只剩下XB[]观察一下XB先是由xb[i]=i,然后通过随机数打乱了顺序,这也是我卡住的地方,我以为是通过动态调用直接得到xb打乱后的结果,结果我动不了一点,然后我想到了伪随机,python的随机数和c的不太一样so就没搞出来
下来我自己痛定思痛,决定用c再搞搞,于是再一个阳光明媚的中午,翘了一节课的代价,搞了出来,并写下了这篇wp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>
int main() {
srand(1);
int xb[33];
char crflag[] = "3A!T_rh0_Ts3_a_siSoycPS!C{sDFE}S";
srand('\x01');

for(int i=0;i<33;i++)xb[i] = i;
for (int i = 0; i < 33; i++) {
int j = rand();
int k = (j % 32);
int temp = xb[i];
xb[i] = xb[k];
xb[k] = temp;
temp = 0;
}
int i = 0;
while (i < 32) {
for (int j = 0; j < 33; j++) {
if (xb[j] == i)printf("%c", crflag[j]);
}
i++;
}

}

首先计算机中不存在绝对的随机,再c语言中随机数由随机种子srand决定,当srand被固定时,之后的随机数也就固定了,也就说xb[]可以得到了,再通过相关逻辑的逆推理
最后flag=DASCTF{Th3_Proc3ss_iS_S0_Eas!!}