论坛首页 逆向工程技术区 阅读主题

[原创][新手向]Moectf2025 Reverse方向全解

443 浏览 0 回复
#1 楼主 2026-06-01 21:08:55
欢迎师傅们来我的博客SydzI's Blog逛逛喵附件程序用010editor打开,可以看到upx版本,可以找对应版本upx程序脱壳,也可以手动脱壳(采用内存镜像法):用x64dbg打开程序,先移除预设断点在“内存映射”窗口给程序的.rsrc段下一次性内存访问断点,F9运行然后在UPX0段或者UPX1段下一次性内存写入断点,F9运行回到“CPU”窗口,可以看到在RIP不远处有一个大跳(RIP在0x00007FF7BB887423处)跟进去,还有个跳转表,继续跟进,可以看到程序的OEP了然后在此处使用scylla dump出程序,并且修复IAT,得到upx_dump_SCY.exe,可以分析了分析main函数,发现每个输入的字符异或了0x21,而非末位字符还异或了原来的下一位。由于异或有交换律,所以解密逻辑可以是:先对每个处理完的字符异或0x21,然后再从倒数第二位开始和下一位异或,这样就恢复了复原出了flag(但是给的密文少了最后一位,即字符串的结束符。根据最后一位和倒数第二位的关系0x56=125 ^ 0x21 ^ 末位 得出:末位=10,所以末位^0x21=43,将密文补充完整)解密脚本:附件程序main函数逻辑如下,wasd迷宫题,迷宫在函数maze_init中maze_init函数:使用神奇妙妙工具得到迷宫路径:附件程序用IDA打开,在汇编界面上下滑动可以找到花指令引起的红色栈帧报错。打开IDA工具栏的“Options”选项的“General”,勾选“Stackpointer”,可以看到栈帧信息 可以看到红色报错的函数栈帧超过了1000,有点反常,找到栈帧发生突变的地方,发现用sub rsp,1000h改变了栈帧,把这条指令nop掉。本题这个类型的花指令占绝大多数,需要耐心的一个一个nop掉。(还有sub rsp,400h的,主要留意栈帧大于100)还有另一种花指令:图中Label+1是0x004048EF,被0x004048EE处的指令覆盖住了,所以undefine一下,IDA就会自动纠错。把没用的指令nop掉接下来要做的修改有2点。首先可以看到0x004048E5处有一个恒跳花指令,这个要nop掉。然后是call loc_4048EF,由于call是会占用栈帧的,更何况call一个标签没有ret恢复栈帧,后面栈帧还是会报错(这里有一个试错过程,不把call改成jmp的话,函数undefine+code+create function后依旧反编译不了)。做法就是工具栏edit->patch program->change byte,把十六进制码E8改成E9然后就是选中函数名undefine+code+create function了,就可以正常反编译了main函数逻辑主要是把flag掐头去尾,中间部分加密后比对加密函数encode如下,就是把flag[i]和key异或,key会递增。需要注意的是,静态分析下得到的key是不正确的(静态分析得到的key是0x23,但是动态调试会发现程序运行到此处key变成0x29),动调得到的key才能解密出flag解密脚本:IDA打开附件程序,main函数逻辑是将输入的flag分成10份,每次取两份进行加密,加密出来的数据和enc比较。key和enc已经给定加密函数是改动的tea加密解密逻辑:将tea内的p1 p2位置对调,"+"改成"-",然后delta从最后一轮的值往回递减就可以了。解密脚本:附件程序main函数逻辑主要是获取flag,然后掐头去尾,对中间部分进行check。main函数:check函数:题目提示了z3,所以使用z3约束求解。思路就是复现check函数逻辑,爆破出flag脚本:IDA打开附件程序,在字符串窗口可以直接看到flag运行附件程序,直接让输入flag。IDA打开分析main函数,发现使用了标准base64加密,并且密文直接给了。cyberchef一把梭附件程序运行出现一道黑影,看不清。IDA分析main函数,发现使用了WNDCLASSA结构体(详细信息见:WNDCLASSA (winuser.h) - Win32 apps | Microsoft Learn),主要逻辑是创建窗口,关键部分是窗口结构体变量lpfnWndProc,它指向了窗口的逻辑(即代码中的WndProc函数)分析WndProc函数发现,窗口似乎直接输出flag。于是下断点,动态调试动态调试结果如图:使用decompyle3反编译得到:可以看出实现了一个凯撒加密,分析逻辑可以看出实际上是给每个字母移位了10(ascii码+10),所以给字母减10就ok了,可以基于源码进行微小改动得到解密脚本:先看main函数反编译结果,发现只有简单的两个函数,其中solve函数有更复杂的逻辑:然而solve函数并不能看出什么有用的逻辑出来,sub_114514出现了flag字样,但是动调发现没有用处结合题目提示try catch不能被正确反编译,于是直接查看汇编代码。在汇编代码里看到一个类似flag格式的字符串,分析后续逻辑发现对这个字符串进行了处理,分析发现处理结果就是flag解密脚本:附件程序运行不了,如图:题目提示upx特征段魔改,但是自己尝试后发现魔改特征段不会导致程序运行不了后来琢磨了半天,拷打(bushi了一下出题人,才发现这个程序缺了bytes。(下面两张图是week1_upx的结尾和本题程序的结尾)缺少的地方在upx特征段,可以发现upx1段开头的四个字节错位了,错位到upx特征段上了,所以要给特征段插入四个字节。(下面两张图是week1_upx的upx特征段和本题程序upx特征段的结尾) 用010editor在49 01 00 C3后面按Ctrl+shift+I插入4bytes(默认填充为0),会发现程序可以运行了采用手动脱壳的办法。具体操作可以参考week1_upx的解法或者看看Day9:壳与脱壳(一)和Day10:壳与脱壳(二)(王婆卖瓜这一块,这里从找到OEP开始:下断点F9运行到上图这个大跳,然后F7步入RIP指向此处时,打开scylla进行转储和IAT重建修复转储。这里需要注意,IAT搜索出来的结果里有一个损坏的导入,需要把它删掉脱壳后的_dump_SCY.exe文件就可以用IDA打开正常分析了首先查看字符串表,可以发现可疑的的提示"correct"跟踪correct可以找到main函数。下面是优化后的main函数和相关的函数可以看出逻辑就是先魔改base64的编码表,然后再用魔改的编码表对flag进行base64编码,最后和给定的密文比较。可以先对enc进行异或,然后再base64解码反编译的代码分析优化后大概是这样:由于加密主要依赖的是异或,只要复原出加密时的环境(相关变量),就可以再次加密实现复原。下图是AI给的加密逻辑分析。首先每轮加密的密钥不同,其次每个字符块的加密都依赖前一块和后一块。突破口:对于flag9而言,它的前一块和后一块都是经过本轮加密的,也就是说在最后一轮,flag9依赖的是最终密文的flag0和flag8,可以利用最终密文直接解密。解密出最后一轮的未加密flag9后,就可以往回解密flag8-flag0,就这

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288936.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号