@TOC

ror

在这里插入图片描述我第一个想到的办法是z3 然后看见下标了,就没有用 ,去手算,
事实证明,我脑袋不对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from z3 import*
Str=[BitVec(('x%d'%i),8) for i in range(40)]
s=Solver()
a=[0,181,122,206,37,108,7,223,0,251,124,38,75,62,134,154,0,255,37,144,255,28,56,176,0,231,60,121,225,144,251,30,0,204,179,51,78,145,65,222]
v6=[128,64,32,16,8,4,2,1]
for i in range(0,40,8):
for j in range(0,8,1):
v5=((v6[j] & Str[i + 3]) << (8 - (3 - j) % 8)) | ((v6[j] & Str[i + 3]) >> ((3 - j) % 8)) | (
(v6[j] & Str[i + 2]) << (8 - (2 - j) % 8)) | ((v6[j] & Str[i + 2]) >> ((2 - j) % 8)) | (
(v6[j] & Str[i + 1]) << (8 - (1 - j) % 8)) | ((v6[j] & Str[i + 1]) >> ((1 - j) % 8)) | (
(v6[j] & Str[i]) << (8 - -j % 8)) | ((v6[j] & Str[i]) >> (-j % 8))
v7=(((v6[j] & Str[i + 7]) << (8 - (7 - j) % 8)) | ((v6[j] & Str[i + 7]) >> ((7 - j) % 8)) | (
(v6[j] & Str[i + 6]) << (8 - (6 - j) % 8)) | ((v6[j] & Str[i + 6]) >> ((6 - j) % 8)) | (
(v6[j] & Str[i + 5]) << (8 - (5 - j) % 8)) | ((v6[j] & Str[i + 5]) >> ((5 - j) % 8)) | (
(v6[j] & Str[i + 4]) << (8 - (4 - j) % 8)) | ((v6[j] & Str[i + 4]) >> ((4 - j) % 8)) | v5)
s.add(v7==a[i+j])

if(s.check()==sat):
result=s.model()
str=[chr(result[Str[i]].as_long().real) for i in range(40)]
print("".join(str))
#print(s)

TacticalArmed.exe

回调函数里有反调试 int 2d
正常情况会抛出异常,执行异常代码,调试器附加后,则跳过
异常代码赋给了四个参数,暂时不知道有什么用
在这里插入图片描述
在这里插入图片描述在主函数里一共两个重要函数
sub_4011f0 执行smc解码函数
v21 执行程序的加密函数
在这里插入图片描述通过od调试,把一轮的v21指令都给找出来

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
28
29
30
31
32
33
34
8B 0D 00 00 00 00                 mov     ecx, large ds:0
81 E9 D2 96 5A 7E sub ecx, 7E5A96D2h
89 0D 00 00 00 00 mov large ds:0, ecx
8B 15 00 00 00 00 mov edx, large ds:0
C1 EA 05 shr edx, 5
A1 00 00 00 00 mov eax, large ds:0
03 C2 add eax, edx
8B 0D 00 00 00 00 mov ecx, large ds:0
03 0D 00 00 00 00 add ecx, large ds:0
33 C1 xor eax, ecx
8B 15 00 00 00 00 mov edx, large ds:0
C1 E2 04 shl edx, 4
8B 0D 00 00 00 00 mov ecx, large ds:0
03 CA add ecx, edx
33 C1 xor eax, ecx
8B 15 00 00 00 00 mov edx, large ds:0
03 D0 add edx, eax
89 15 00 00 00 00 mov large ds:0, edx
A1 00 00 00 00 mov eax, large ds:0
C1 E8 05 shr eax, 5
8B 0D 00 00 00 00 mov ecx, large ds:0
03 C8 add ecx, eax
8B 15 00 00 00 00 mov edx, large ds:0
03 15 00 00 00 00 add edx, large ds:0 33 CA xor ecx, edx
A1 00 00 00 00 mov eax, large ds:0
C1 E0 04 shl eax, 4
8B 15 00 00 00 00 mov edx, large ds:0
03 D0 add edx, eax
33 CA xor ecx, edx
A1 00 00 00 00 mov eax, large ds:0
03 C1 add eax, ecx
A3 00 00 00 00 mov large ds:0, eax


魔改的tea
key就是之前说的那四个参数
sum值和delta魔改了
改写脚本即可(只是第一轮的脚本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void decrypt (unsigned int* v,unsigned int* k) {
unsigned int v0=v[0], v1=v[1], sum=0x81A5692E*33, i;
int delta=0x81A5692E;
unsigned int k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for (i=0; i<33; i++) {
v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
sum -= delta;
}
v[0]=v0; v[1]=v1;
}

int main()
{
unsigned int v[100]={0x422f1ded,0x1485e472},k[4]={0x7ce45630,0x58334908,0x66398867,0xc35195B1};

for(int i=0;i<2;i+=2){
decrypt(&v[i], k);

printf("%x %x",v[0],v[1]);
}

return 0;
}

gghdl

异或0x9c
如果看着代码多,而没有尝试去做一下,那么真是太可惜了

虚假的粉丝

结合动态调试,理清大概逻辑
第一个输入Y
然后输入三个key
第一个是文件的名字
第二个是文件的偏移
第三个是匹配字符串的大小
在这里插入图片描述
输入正确后会进行下一个环节的匹配
需要遍历所有文本文件,这里用别的师傅的一个脚本

1
2
3
4
5
6
7
8
9
import os.path
path = r"C:\Users\86178\Desktop\f"
arr = os.listdir(path)
for pt in arr:
with open(os.path.join(path, pt), "r") as f:
text = f.read()
idx = text.find("U")
if idx != -1 and text[idx + 39] == 'S':
print(pt, idx, text[idx: idx+39+1])

跑出来的偏移有点差距 加上8就行
在这里插入图片描述
在这里插入图片描述base解码后刚好符合下一个输入,后面就是不停的对ASCII-faded 5315.txt进行处理
坐等处理完即可拿到flag
在这里插入图片描述

在这里插入图片描述