这题给了一个exe文件,本来我还以为是要用OD了(太长时间没用想复习一下)
结果IDA打开发现了一串很奇怪的字符串

437261636b4d654a757374466f7246756e

显然不是base64加密,一般来说不是crypto题加密方式就那么几种,密码学,16进制转字符串…

由此得到flag
CrackMeJustForFun
但是要是这样就结束了,那这题基本等于没做。
所以我决定从头分析一下逻辑。
直接打开exe文件

是一个让user输入序列号的程序,而正确的序列号就是我们的flag。
int __cdecl main(int argc, const char **argv, const char **envp) { signed int
v3; // ebx char v4; // al int result; // eax int v6; // [esp+0h] [ebp-70h] int
v7; // [esp+0h] [ebp-70h] char v8; // [esp+12h] [ebp-5Eh] char v9[20]; //
[esp+14h] [ebp-5Ch] char v10; // [esp+28h] [ebp-48h] __int16 v11; // [esp+48h]
[ebp-28h] char v12; // [esp+4Ah] [ebp-26h] char v13; // [esp+4Ch] [ebp-24h]
strcpy(&v13, "437261636b4d654a757374466f7246756e");//把字符串赋给了v13 while ( 1 ) {
memset(&v10, 0, 0x20u); v11 = 0; v12 = 0; sub_40134B((int)aPleaseInputYou, v6);
//输出"Please input your serial:" scanf(aS, v9);//读取输入的字符串 if ( strlen(v9) > 0x11
)//长度限制 break; v3 = 0; do { v4 = v9[v3]; if ( !v4 )//字符串非空检验 break; sprintf(&v8,
asc_408044, v4);//下面就是逐个字节的变换 strcat(&v10, &v8); ++v3; } while ( v3 < 17 ); if
( !strcmp(&v10, &v13) )//在这一步比较,我们从这往上看 sub_40134B((int)aSuccess, v7); else
sub_40134B((int)aWrong, v7); } sub_40134B((int)aWrong, v7); result = stru_408090
._cnt-- - 1; if ( stru_408090._cnt < 0 ) return _filbuf(&stru_408090); ++
stru_408090._ptr; return result; }
这一段程序就是把"437261636b4d654a757374466f7246756e"经过变换后和我们输入的作对比,再根据结果输出。

技术
©2019-2020 Toolsou All rights reserved,
html+css个人简历/网页界面【超详细】Java实现学生信息管理系统java 数组下标 变量_Java基础语法:数组实验四 自动化测试工具-软件测试C++之string的compare用法2022蓝桥杯JavaB组省赛试题docker镜像存储在哪里opencv-python傅里叶变换以及逆变换C语言——qsort函数计算机一级多分,多少分能过一级计算机考试