Easy Crack
这道题是最简单的一道题,运行程序,是一个windows窗体程序,peid查壳发现没有加壳。
要求输入序列号然后点??验证,我们随意输入字符串,发现弹出incorrect password的提示。
拖进ida里面搜索字符串,f5大法,找到关键函数,如下:
1 | int __cdecl sub_401080(HWND hDlg) |
显然,调用了函数GetDlgItemTextA拿到text控件内的值,然后做了一个简单的判断,如果不满足if内的条件,就输出incorrect。而if内的条件都是内存内的常量字符串或字符,直接将String+v3+v4+v5拼接即可得到flag。
Easy Keygen
这道题也比较容易,下载下来一个压缩包,包含一个exe和一个txt,txt内告诉了你序列号,让你找到序列号对应的用户名。
运行程序,发现让分别输入序列号和用户名:
查壳发现未加密,拖进ida搜索字符串Wrong,定位到_main函数下。
完整代码如下(因为便于观看部分变量被我换了名儿):
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
其中关键代码如下:
1 | for ( i = 0; v3 < (signed int)strlen(&usernameorpass); ++i ) |
可以看出,加密的流程为遍历username的每一位,将其每一位与v8、v9、v10(16、32、48)异或(与谁异或取决于循环次数模3的值)。
编写exp如下:
1 | seri = "5B134977135E7D13" |
成功得到结果,验证之: