新年快乐题解
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!}