52破解论坛【2021春节红包题】破解分享
今年的论坛红包题,我尝试玩了玩WINDOWS的题目,碰巧两道都解出来了,在这里我分享一下破解过程。
首先,这个玩法就是,你用论坛提供的程序,通过逆向,得到口令,然后提交到论坛里,如果正确,就可以得到相应的论坛币。
【2021春节】解题领红包之二,这道题是初级题,确实很容易,我把过程分享下:
通过论坛,拿到题目,放入PEID,查了下,这道题没有加壳。
那么,直接运行一下,看看是什么效果。是让你输入密码,然后随便输入一个,发现密码错误。嗯,这是一个简单的程序,逻辑不复杂,估摸着就是一个字符串比较,那么,就要想办法拿到正确的字符串。
所以,我直接使用OD,启动程序,然后扫描字符串,在这里下断点:
为什么在这里下断呢,因为JE下面,就是要么正确的ASCII输出,要么就是错误的输出,所以,我就在这里下断,看看是什么情况。结果断下后,F8到JE上面,就发现了一些有趣的信息,就是如图这一条。我就猜,这会不会就是密码。
果断尝试了一波,密码正确。具体过程我也没分析,算法也没研究,好吧,我想我拿到密码就OK。
好了,这个第一题,就这样被我搞出来了。第二道题,就有些难度了,拿到题目的时候,还是同样的操作,放入PEID,看看是否加壳。
看,难度来了,首先有壳,EP被换,直接用UPX脱壳工具我不知道能不能脱。所以,我直接手动脱,能不能脱干净我不知道,不过我还是抱着试一试的态度,开始。首先,将原始程序复制一个备份,然后直接用OD加载程序,加载后提示:
直接选择否,然后继续,在PUSHAD后面下断点,然后运行。
接着,根据ESP定律,对ESP所在内存区域,下硬件访问断点。
接着运行,看什么时候被断下。紧接着,在一个循环被断下,开始找OEP,在JMP处下断点,然后看JMP跳转到何处,那处就是OEP。
执行JMP后,在代码处开始脱壳:
用Dump插件,如图,点脱壳,然后保存一个新的EXE在任意位置,这时候,还没有重建,所以,是无法运行。
这时候,不要关闭OD,直接打开ImportREC,开始重建导入表。首先,选择目前正在运行的这个进程,然后在OEP处,填写刚才的OEP,这里是B37B。接着点击AutoSearch,然后Get Imports。等待完成后,直接Fix Dump,选择刚才Dump出来的文件。这时候,Dump的文件应该可以顺利执行。
直接运行脱壳后的程序,仍然选否,运行后,发现没有任何问题。
这时候,应该就是脱壳后,可以搜索到东西了。此刻,搜索下字符串,看到了输出的:
中级题的第一步,算是做完了,然后就是拿到密码了。还是老规矩,先走一遍流程,看看程序的过程。第二个程序,是输入你的论坛uid,然后输入密码,仍然是给与正确和错误。所以,我猜测,这个密码和自己的UID有关,所以,这个可能是作者为了避免作弊,至于是不是和UID挂钩,此刻我不知道,因为我不知道加密过程,密码计算方式。既然是我解密的过程,那么我把我的想法也写在这里吧。我第一个猜测的就是,会不会输入我的UID,然后输入正确的密码,程序会自动输出一段密码,作为我的口令。所以,我通过OD,跟踪流程,在2次输入后,关键的跳转处,强制改成了输出正确,看看后面会有什么提示。如图:
就是这个跳转,我NOP后,发现就一个成功的输出,并没有任何输出,好吧。我想,我还是太天真了。ORZ,那么这下直接用OD看,就不是那么方便了。还是要看伪代码,猜算法了。所以,直接把程序拖入IDA,看看整个流程图吧。
接下来的过程,我也只能简单的一笔带过了,就是不断的查看伪代码,然后查看流程,找到一些关键的信息,然后跑到OD里面,动态去查看过程,这是一个比较漫长的过程。因为我只是个入门学徒,所以花费了不少时间,看到了一个比较有趣的地方,就是这个2次CALL:
这段代码是输入KEY后,执行跳转之前,也是会影响结果的调用。通过跟踪,我在黄色这个CALL内部,发现了如下内容:
我跟踪黄色CALL代码的时候,发现了这个flag{Happy_New_Year_52Pojie_2022},这个字符,我猜想,这个会不会就是题目的密码,然后输入了一下,又是一桶凉水,泼在我身上,还是错误。不过,我觉得这个函数,应该是关键函数了。所以,我仔细读伪代码,终于发现了一个问题:
就是这个 if( V8 ),前面那么多,后面那么多,其实不重要,重要的是V8这个结果。V8是从哪来得,就是这个函数:
那么这里到底做了什么事情?直接在这个函数下段,反复调试,一步一步走,看看有些啥线索。
经过多次调试,我终于发现了问题和关键点:
你看出来了么,我输入的密码,已经被加密成其他密码,并且要和flag{Happy_New_Year_52Pojie_2022}做比较,找到这一步,我觉得我快成功了。不过在这里,我犯了一个错误,就是长度。我第一次强制修改内存,但在这里修改,长度检测已经过了,所以,就算在这里把加密后密文改成flag{Happy_New_Year_52Pojie_2022},还是无法通过的,因为这个00403EFA F3:A6 REPE CMPS BYTE PTR ES:[EDI], BYTE PTR DS>,是根据长度逐字比较的。后来我发现了这个问题,直接输入等长后的密码,然后在这里强制改内存,果然,就是通过的结果:
那么,怎么获得正确的密码呢?可以通过IDA,一步一步的去分析加密方式,然后查看密码算法。这是一个办法,而我,是用了一个比较懒得办法,因为我实在不想去分析算法,比较头大。我是这样做的,首先,第一个用例,UID使用12345,KEY输入5个小写a,5个大写A,5个数字1,5个符号#,然后看加密后的结果:
第二个用例:UID使用54321,KEY输入5个小写a,5个大写A,5个数字1,5个符号#,然后看加密后的结果:
好,你发现了什么吗?我来告诉你我的结论,这个加密算法,和字符的位置没有关系,和UID有关系,数字和符号不被加密,字符的大小写加密结果一样。所以,要得到正确的口令,需要输入我真实的UID。最后一个用例就是,我的UID:我真实UID,KEY:abcdefghijklmnopqrstuvwxzy,就可以得到字符对应的密码,也就是字典。
来吧,字典出来了,写个简单的python,则可以跑出密码了:
ps1 ="bungzslexqjcvohatmfyrkdwpi"
ps2 ="abcdefghijklmnopqrstuvwxyz"
ps3 = "flaghappynewyearpojie"
l = len(ps3)
for ch in ps3:
idx = ps1.find(ch)
print(ch + " _ " + ps2[idx])
输入了结果,然后自己手动组合下,改变下大小写,这一题,就这样被我搞定了。
作为一个学徒,做完了,验证成功,还是小小的高兴了一下。对于大牛来说,肯定不会像我这样走很多弯路,大神应该很快就可以把这个题秒杀了吧,我还是自己断断续续做了2天。大概总时间也花费3到4个小时吧,所以,还是要多提高吧。比如,如果换个其他的壳,我估计第一步都搞不定了。
最后,还是感谢52破解论坛出了这么有趣的题,大家新年快乐,就看一个笑吧:)
Categories: Garfield's Diary