0%

buuctf-SimpleRev

链接:https://pan.baidu.com/s/15ojPMVsasx3EZ9s5wVQqEw
提取码:icjp

0x01 使用EFPE查看文件

1

没有加壳,64位文件

0x02 使用IDA打开文件,查看main函数,F5反编译

3

0x03 查看 Decry()函数

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
__int64 Decry()
{
char *v0; // rax@1
char v2; // [sp+Fh] [bp-51h]@19
int v3; // [sp+10h] [bp-50h]@1
signed int v4; // [sp+14h] [bp-4Ch]@1
signed int i; // [sp+18h] [bp-48h]@1
signed int v6; // [sp+1Ch] [bp-44h]@1
char src[8]; // [sp+20h] [bp-40h]@1
__int64 v8; // [sp+28h] [bp-38h]@1
int v9; // [sp+30h] [bp-30h]@1
__int64 v10; // [sp+40h] [bp-20h]@1
__int64 v11; // [sp+48h] [bp-18h]@1
int v12; // [sp+50h] [bp-10h]@1
__int64 v13; // [sp+58h] [bp-8h]@1

v13 = *MK_FP(__FS__, 40LL);
*(_QWORD *)src = 357761762382LL; //选中之后H键转换16进制为0x534C43444ELL,数据在内存中是小端顺序,高位在高地址处,低位在低地址处,故实际的字符顺序应为'0x4e44434c53'经过16字符转换为ASCII码转换后字符为'NDCLS'
                      
v8 = 0LL;
v9 = 0;
v10 = 512969957736LL; //同上,转换后查询Ascii码为"wodah"
v11 = 0LL;
v12 = 0;
LODWORD(v0) = join(key3, &v10); //在main页面v3='kills',v10=’wodah‘,这个函数就是把v3和v10两个字符串相拼接'killshadow'
text = v0;
strcpy(key, key1); //strcpy函数就是让key1的值('ADSFK')赋予key
strcat(key, src); //strcat函数就是让src的值拼接到key后面也就是'ADSFKNDCLS'
v3 = 0;
v4 = 0;
getchar(); //清空缓冲区
v6 = strlen(key); //v6的长度等于key,v6=10
for ( i = 0; i < v6; ++i )
{
if ( key[v4 % v6] > 64 && key[v4 % v6] <= 90 ) //将大写字母转换为小写字母
key[i] = key[v4 % v6] + 32; //’adsfkndcls‘
++v4;
}
printf("Please input your flag:", src);
while ( 1 )
{
v2 = getchar();
if ( v2 == 10 )
break;
if ( v2 == 32 )
{
++v3;
}
else
{
if ( v2 <= 96 || v2 > 122 ) //如果输入的v2不是小写字母
{
if ( v2 > 64 && v2 <= 90 ) //如果v2为大写字母
str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; //对srt[v3]进行处理(v3为0每次加1)//// str1[v3] = (v2-key[v4]+58)%26 + 97//变换后str2[v3]存放小写字母
}
else
{
str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; //同样处理
}
if ( !(v4 % v6) )
putchar(32);
++v3;
}
}
if ( !strcmp(text, str2) ) //如果text和存储的str2相同,就成功·
puts("Congratulation!\n"); //text = ""killshadow"
else
puts("Try again!\n");
return *MK_FP(__FS__, 40LL) ^ v13;
}

分析代码以及相应的值,我们已经可以知道text以及key的值,剩下就是str2,str2就是我们想要的flag

得到flag的条件关键在于式子str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97

0x04 构造playload爆破

1
2
3
4
5
6
7
8
9
text = 'killswodah'
key = 'adsfkslcdn'
flag = ''
for i in range(len(key)):
for j in range(65,122):
if ord(text[i]) == (j - 39 - ord(key[i % 10]) + 97) % 26 + 97:
flag += chr(j)
break
print(flag)

flag{KLDQCOZFDU}

欢迎关注我的其它发布渠道