Question
Solution
扔入ida睇下個main咩料先
1 | __int64 __fastcall main(__int64 a1, char **a2, char **a3) |
首先個program會讀38位Input1
_isoc99_scanf("%38s", s);
然後會用 sub_7F4 呢個function提供既return value做xor1
2for ( i = 0; (signed int)i < v8; ++i )
s[i] ^= sub_7F4(i);
然後會將xor完既結果逐個入落去sub_7B0做運算 , 然後將return value逐個扔番入v91
2for ( j = 0; j < v8; ++j )
v9[j] = sub_7B0((unsigned int)s[j]);
最後會將v9 同 dword_201040逐個byte做對比1
2
3
4
5
6
7
8
9for ( k = 0; k < v8; ++k )
{
if ( v9[k] != dword_201040[k] )
{
puts("Are you sure you read asm?");
result = 0LL;
goto LABEL_13;
}
}
咁既話即係首先我地要知道 dword_201040 放緊D乜
同埋sub_7F4 , sub_7B0 做緊乜1
2
3
4
5
6
7
8
9
10
11
12
13
14
15__int64 __fastcall sub_7F4(int a1)
{
int v2; // [sp+Ch] [bp-8h]@1
signed int i; // [sp+10h] [bp-4h]@1
v2 = a1;
for ( i = 0; i <= 6; ++i )
{
if ( i & 1 )
v2 ^= 1 << i;
else
v2 |= 1 << i;
}
return (unsigned __int8)v2;
}
1 | __int64 __fastcall sub_7B0(int a1) |
原來仲有個 dword_2010241
.data:0000000000201024 dword_201024 dd 7 ; DATA XREF: sub_7B0:loc_7E4r
咁就應該齊料寫個program去爆番條flag出黎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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
int sub_7F4(int a1);
int sub_7B0(int a1);
int ida_chars2[] =
{
0x19c, 0x169, 0x30, 0x1d6, 0x30, 0x30, 0x199,0x6a, 0x157, 0x0c2,
0x10a, 0x155, 0x150, 0x107, 0x37, 0x12e, 0x22, 0x0f1, 0x1ae,
0x151, 0x0f1, 0x1a, 0x1a5, 0x1ae, 0x0c9, 0x12c, 0x1, 0x166,
0x12c, 0x0cb, 0x30, 0x107, 0x166, 0x1b4, 0x1ae, 0x14c, 0x46, 0x00, 0x00, 0x00
};
int main()
{
int size = 40;
int index = 0;
while (1) {
for (int i = 0x30; i < 0x126; i++) {
int flag = i;
flag ^= sub_7F4(index);
if (sub_7B0(flag) == ida_chars2[index]) {
printf("%c", i);
index++;
}
if (index == 38)
break;
}
}
getchar();
return 0;
}
int sub_7B0(int a1) {
int v2 = 1;
for (int i = 0; i < 7; ++i) {
v2 = a1 * v2 % 0x1e1;
}
return v2;
}
int sub_7F4(int a1) {
int v2;
v2 = a1;
for (int i = 0; i <= 6; ++i) {
if (i & 1)
v2 ^= 1 << i;
else
v2 |= 1 << i;
}
return v2;
}
Flag
BAMBOOFOX{Th4t_1S_s0_eAsY_tO_rEverS3}