PEID 查不出来,用了 die,显示是 UPX3.96 的壳,用了脱壳机,脱不了,只能手动脱壳,拖入 x64dbg,F9 运行到程序领空,很明显的特征,push:
无脑使用 ESP 定律大法,对 ESP 下硬件访问断点:
F9 运行,在 pop 处停下:
F4 运行到下面第一个 jmp,F8,进去又是一个 jmp,继续 F8,到达 OEP:
使用 x64dbg 插件 dump:
第一步先 dump 保存,然后第二步,第三步,第四步选择刚才 dump 保存的程序:
脱壳成功,但是运行一闪而过,这是动态基址搞的鬼,手法很多,有脱壳机有禁用动态基址选项,这里我们直接把程序拖入 010Editor 修改标志位,改为 20 即关闭动态基址,保存退出:
可正常运行,接下来分析算法。
【一一帮助安全学习【点我】一一】①网络安全学习路线②20 份渗透测试电子书③安全攻防 357 页笔记④50 份安全攻防面试指南⑤安全红队渗透工具包⑥网络安全必备书籍⑦100 个漏洞实战案例⑧安全大厂内部教程
1、进入主函数(很明显是 vs 写的程序,根据步骤找主函数就行)F9 进入程序领空,进入第一个 call:
再进入第二个 call:
找特征码,进入标记的 call:
进入第四个 call:
走过一个跳转,进入主函数:
2.动态调试标记的函数是输入 flag 后第一个 call,并且传参进去,所以这里可以跟进去看一看:
随便输入一部分数,回车并跟进标记函数:
从下面可以看到这边传入我们输入 flag,是关键函数,跟进去:
分析函数:
可以猜到 flag 的长度为 20,如果不是 20,直接到打印错误的地方,继续向下看,下面对字符串进行第一次处理。亦或 66,继续看下去,又是一个比较长度函数,之后没什么了,这个函数结束,直到返回主函数:
下面就是打印 wrong,长度为 20 会跳过这个打印:
我们看当前标记的函数,传入参数是我们 flag 亦或 66 之后的字符串,绝对关键函数,跟进去,F8 一直运行:
我们发现又对字符串处理,先+A,再亦或 50:
继续运行发现关键函数,F8 走过直接失败,重新到这个位置,发现传入处理后的第一个字符,跟进去:
我们发现一个 cmp,和我们字符串第一个字母比较:
查看另一个地址的值:
继续跟,会发现直接退出,所以这里是比较函数,直接写脚本:
#include
int main()
{
unsigned int dword_14001D000[20] = {
0x0000004B, 0x00000048, 0x00000079, 0x00000013, 0x00000045, 0x00000030, 0x0000005C, 0x00000049,
0x0000005A, 0x00000079, 0x00000013, 0x00000070, 0x0000006D, 0x00000078, 0x00000013, 0x0000006F,
0x00000048, 0x0000005D, 0x00000064, 0x00000064
};
char flag[21] = { 0 };
for (int i = 0; i < 20; i++)
{
flag[i] = ((dword_14001D000[i] ^ 0x50) - 10) ^ 0x66;
}
printf(flag);
return 0;
}
复制代码
flag:why_m0dify_pUx_SheLL