[FlareOn4]IgniteMe

查壳

image-20230219152315192

拖入ollydbg运行一下程序 顺便看字符串

image-20230219152525182

image-20230219152443500

没啥特别的 拖入ida分析

看字符串 跟踪主函数

image-20230219152601262

image-20230219152941661

跟入4010F0 - 去除\n \r这俩字符

image-20230219152845320

跟入401050

image-20230219153045091

这个里面就是密文倒过来 ^ v5

然后v5不知道值 跟入401000

看不懂 我去动调了一下 得到v5 = 4

动调的话 找到401000这个call运行就知道啦

image-20230219154648453

贴exp

1
2
3
4
5
6
7
8
9
10
11
encData = [0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C, 0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44,
0x6F, 0x6E, 0x56, 0x09, 0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13, 0x17, 0x48, 0x42, 0x01, 0x40, 0x4D,
0x0C, 0x02, 0x69]
flag = ''
arr1 = []
v4 = 4
for i in range(len(encData)-1, -1, -1):
arr1.append(encData[i] ^ v4)
v4 = arr1[-1]
print(''.join(chr(x) for x in arr1[::-1]))
# R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com

flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}

提交 过辣

好的 本题结束 Orz

[GWCTF 2019]xxor

查壳

image-20230219165050212

运行一下 并没有什么有用的东西

image-20230219165139708

拖入ida64分析

跟入主函数

image-20230219165314281

跟踪400770

发现是个方程 用z3库解出所有值

image-20230219165428261

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from z3 import *
a1,a2,a3,a4,a5,a6=Ints('a1 a2 a3 a4 a5 a6')
s = Solver()

s.add(a3 - a4 == 0x84A236FF)
s.add(a4 + a5 == 0xFA6CB703)
s.add(a3 - a5 == 0x42D731A8)
s.add(a1 == 0xDF48EF7E)
s.add(a6 == 0x84F30420)
s.add(a2 == 0x20CAACF4)
if(s.check() == sat):
print(s.model())

#[a3 = 3774025685,
a2 = 550153460,
a6 = 2230518816,
a1 = 3746099070,
a4 = 1548802262,
a5 = 2652626477]

回去看下另一个call

image-20230219165554127

逻辑也不难 逆回去就好了

image-20230219165621010

贴exp

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
35
36
#include <iostream>

#pragma warning(disable:4996)
using namespace std;

int main()
{
__int64 a[6] = { 3746099070, 550153460, 3774025685, 1548802262, 2652626477, 2230518816 };
unsigned int a2[4] = { 2,2,3,4 };
unsigned int v3, v4;
int v5;
for (int j = 0; j <= 4; j += 2) {
v3 = a[j];
v4 = a[j + 1];
v5 = 1166789954 * 0x40;
for (int i = 0; i <= 0x3F; ++i) {
v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + a2[2]) ^ ((v3 >> 9) + a2[3]) ^ 0x10;
v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + *a2) ^ ((v4 >> 9) + a2[1]) ^ 0x20;
v5 -= 1166789954;
}
a[j] = v3;
a[j + 1] = v4;
}

/*将整型数组作为字符输出,注意计算机小端排序*/
for (int i = 0; i < 6; ++i)
{
//cout << a[i] << endl;
cout << *((char*)&a[i] + 2) << *((char*)&a[i] + 1) << *((char*)&a[i]);
}

cin.get();
return 0;
}

# flag{re_is_great!}

flag{re_is_great!}

提交 过辣

好的 本题结束

Orz

总结

第一个不难

学到了动静结合

做题的时候遇见看不懂的可以动调一下

也许就明了 了 哈哈

第二道也不难(笔者用了挺长时间, 还是太菜Orz)

然后 就没然后了 笔者累了 嘿嘿

好的 本期结束 感谢观看

Orz Orz