1.双击运行一下这个exe文件
这个程序也是需要输入一个flag,逆向来查看什么样的字符串是flag
2.查壳
是一个32位可执行文件,加了UPX壳
壳是保护程序不被IDA破解的一种手段,可以手段脱壳,可以使用工具
拖入32位IDA,按下F5不能正常反编译
3.脱壳
UPX是一种经典的壳,越是有名的壳越有各种现成的破解工具
我们所使用的工具
将可执行文件拖入这个工具
可以选择UPX壳的版本号,可以挨个尝试
点击Go,成功脱壳,重新将这个可执行问阿金拖入32位IDA
也可以选择手动脱壳
新年快乐——手动脱壳
4.反汇编分析
得到了正常的反汇编代码
找到主函数,点击F5反编译器
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
char Str2; // [esp+12h] [ebp-3Ah]
char Str1[2]; // [esp+20h] [ebp-2Ch]
char v6; // [esp+22h] [ebp-2Ah]
__main();
strcpy(&Str2, "HappyNewYear!");
*(_WORD *)Str1 = 0;
memset(&v6, 0, 0x1Eu);
printf("please input the true flag:");
scanf("%s", Str1);
if ( !strncmp(Str1, &Str2, strlen(&Str2)) )
result = puts("this is true flag!");
else
result = puts("wrong!");
return result;
}
观察主函数,可以知道输入的字符串是Str1,Str1和Str2相等,就输出this is the true flag!
说明此时的Str2就是flag
上面的代码strcpy(&Str2, "HappyNewYear!");
说明Str2中存储的是HappyNewYear!
得到flag
flag{HappyNewYear!}