第三届上海市大学生网络安全大赛
Reverse-crackme:
题目描述:crackme
解题方法:把附件下载下来发现是一个.EXE文件,把它放进exeinfope.exe里面来查看一下他的信息
这里我们发现它是一个32位的有壳的程序,但这里显示的不是UPX壳,而是nsPack的壳,所以我们这里就用一个专门脱nspack的脱壳软件:
脱壳成功之后我们再把它放进exeinfope.exe里面去查看一下:
现在就可以发现没有壳了,然后我们把它放进32位的IDA里面去分析的源代码:
进去shift+f12,搜索字符串,找到关键信息(right),最后索引回去F5一下,反汇编它的核心代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // eax
char Buffer[52]; // [esp+4h] [ebp-38h] BYREF
memset(Buffer, 0, 50);
printf("Please Input Flag:");
gets_s(Buffer, 0x2Cu);
if ( strlen(Buffer) == 42 ) //判断我们的输入是否为42
{
v4 = 0;
while ( (Buffer[v4] ^ byte_402130[v4 % 16]) == dword_402150[v4] ) //这里将我们的输入进行一系列的转换,也是最关键的部分,转换后比较相同就输出right
{
if ( ++v4 >= 42 )
{
printf("right!\n");
return 0;
}
}
printf("error!\n");
return 0;
}
else
{
printf("error!\n");
return -1;
}
}
这里我们分析完后是一个清晰的加密转换过程,只有将它逆向回去就可以得到我们的输入flag,我们先获取byte_402130函数里面的内容:
再找到dword_402150函数里的值:
解密python代码:
byte = 'this_is_not_flag'
down = [0x12,4,8,0x14,0x24,0x5C,0x4A,0x3D,0x56,0x0A,0x10,0x67,0,0x41,0,1,0x46,0x5A,0x44,
0x42,0x6E,0x0C,0x44,0x72,0x0C,0x0D,0x40,0x3E,0x4B,0x5F,2,1,0x4C,0x5E,0x5B,0x17,
0x6E,0x0C,0x16,0x68,0x5B,0x12,2,0x48,0x0E]
flag = ''
for i in range(0,42):
flag += chr(ord(byte[i % 16]) ^ down[i])
print(flag)
注意再获取dword_402150函数里面的值的时候,要细心0也不能省去
最后得到flag:
flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
标签:网络安全,Buffer,大赛,flag,crackme,v4,printf,byte From: https://www.cnblogs.com/xyweiwen/p/18098269