【攻防世界】Reverse系列之Hello_CTF

【攻防世界】Reverse系列之Hello_CTF

程序运行如下:

反汇编获取其主函数代码

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
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // ebx
char v4; // al
int result; // eax
int v6; // [esp+0h] [ebp-70h]
int v7; // [esp+0h] [ebp-70h]
char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
char v10[32]; // [esp+28h] [ebp-48h] BYREF
__int16 v11; // [esp+48h] [ebp-28h]
char v12; // [esp+4Ah] [ebp-26h]
char v13[36]; // [esp+4Ch] [ebp-24h] BYREF

strcpy(v13, "437261636b4d654a757374466f7246756e");
//为v13赋值
while ( 1 )//进入循环
{
memset(v10, 0, sizeof(v10)); //v10=0
v11 = 0;
v12 = 0;
sub_40134B(aPleaseInputYou, v6);//
scanf("%s", v9); //输入值
if ( strlen(v9) > 0x11 ) //长度小于0x11,即17
break;
for ( i = 0; i < 17; ++i )
{
v4 = v9[i];
if ( !v4 ) //v4!=0
break;
sprintf(Buffer, "%x", v4);//将v4以16进制保存在buffer中
strcat(v10, Buffer);//v10=buffer
}
if ( !strcmp(v10, v13) ) //比较v10和v13,相等则成功
sub_40134B(aSuccess, v7); //输出success
else
sub_40134B(aWrong, v7);
}
sub_40134B(aWrong, v7);
result = --Stream._cnt;
if ( Stream._cnt < 0 )
return _filbuf(&Stream);
++Stream._ptr;
return result;
}

上面的代码大概意思就是将**”437261636b4d654a757374466f7246756e”**这一串十六进制数转换为字符串进行判断,所以转换后的字符串就是flag

逆向代码如下:

1
2
3
4
5
6
import binascii

hex_str = "437261636b4d654a757374466f7246756e" # 十六进制字符串
bytes_arr = binascii.unhexlify(hex_str) # 转换为字节串
str_result = bytes_arr.decode('utf-8') # 将字节串转换为字符串
print(str_result) # 输出结果:hello world
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信