image-20230525181631610

是一个ELF 文件 ,这里可以先打开看看是啥

image-20230525183059771

其实我猜测,这里有一个算法,输入的东西然后进行匹配吧。

上面知道了是64位的,我们这里就用IDA打开看看

image-20230525183506559

很明显这个patch_me这个函数是关键

image-20230525183542646

传入的值放入 al 中,然后对他进行了if判断,这里看get_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
unsigned __int64 get_flag()
{
unsigned int v0; // eax
int i; // [rsp+4h] [rbp-3Ch]
int j; // [rsp+8h] [rbp-38h]
__int64 s; // [rsp+10h] [rbp-30h] BYREF
char v5; // [rsp+18h] [rbp-28h]
unsigned __int64 v6; // [rsp+38h] [rbp-8h]

v6 = __readfsqword(0x28u);
v0 = time(0LL);
srand(v0);
for ( i = 0; i <= 4; ++i )
{
switch ( rand() % 200 )
{
case 1:
puts("OK, it's flag:");
memset(&s, 0, 0x28uLL);
strcat((char *)&s, f1);
strcat((char *)&s, &f2);
printf("%s", (const char *)&s);
break;
case 2:
printf("Solar not like you");
break;
case 3:
printf("Solar want a girlfriend");
break;
case 4:
s = 0x7F666F6067756369LL;
v5 = 0;
strcat(&f2, (const char *)&s);
break;
case 5:
for ( j = 0; j <= 7; ++j )
{
if ( j % 2 == 1 )
*(&f2 + j) -= 2;
else
--*(&f2 + j);
}
break;
default:
puts("emmm,you can't find flag 23333");
break;
}
}
return __readfsqword(0x28u) ^ v6;
}

最开始的

1
2
3
4
v0 = time(0LL);
srand(v0);
for ( i = 0; i <= 4; ++i )
{

这里用了随机数,但是用随机数不太可能

然后,下面有5个case 语句 case 2和case 3 实际没有啥作用

现在分开看case 1 4 5

case 1

1
2
3
4
5
6
7
8
case 1:
puts("OK, it's flag:");
memset(&s, 0, 0x28uLL);
strcat((char *)&s, f1); // strcat 是往后面追加字符串的函数
// f1: db 'GXY{do_not_',0
strcat((char *)&s, &f2); // f2的值不知道是啥,但是知道f2的值在f1后面,踏面链接起来的。应该是链接好了就是flag
printf("%s", (const char *)&s);
break;

case 4

1
2
3
4
5
6
case 4:
s = 0x7F666F6067756369LL; // 这里的s点过去看到应该是大端存放,所以应该是倒叙的。s=
v5 = 0;
strcat(&f2, (const char *)&s); // 在f2后面追加了s【这里的s需要是倒叙】
//因为f2是空的,所以f2也就是s
break;

case 5

1
2
3
4
5
6
7
8
9
case 5:
for ( j = 0; j <= 7; ++j )
{
if ( j % 2 == 1 )
*(&f2 + j) -= 2; // f2[j] -=2 这里的&f2+j 就是数组的意思
else
--*(&f2 + j); // f[j] --
}
break;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
char f2[] = { 0x69 ,0x63 ,0x75 ,0x67 ,0x60 ,0x6F ,0x66 ,0x7F };
char w[8];
for (int i = 0; i < 8; ++i)
{
if (i % 2 == 1)
{
w[i] = f2[i] - 2;
}
else
{
w[i] = f2[i] - 1;
}

}


printf("%s", w);

return 0;
}

image-20230525193337312

然后和前面的f1链接起来

GXY{do_not_hate_me}

flag{do_not_hate_me}