写点什么

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

  • 2022-10-31
    湖南
  • 本文字数:1067 字

    阅读完需:约 4 分钟

一、脱壳

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

用户头像

我是一名网络安全渗透师 2021-06-18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
网络安全CTF之最新网鼎杯解题思路_黑客_网络安全学海_InfoQ写作社区