网络安全 CTF 之最新网鼎杯解题思路

一、脱壳

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,和我们字符串第一个字母比较:

查看另一个地址的值:

继续跟,会发现直接退出,所以这里是比较函数,直接写脚本:

#includeint 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

猜你喜欢

转载自blog.csdn.net/zxcvbnmasdflzl/article/details/128645296