看雪论坛
发新帖

湖湘杯CTF大赛reverse(逆向)题分享

Jason姚 2017-1-3 22:22 7501
如题,本人大一学生,前段时间参加湖湘杯CTF大赛在复赛中遇到了一道有趣的逆向题目,不过最终没能做出来。已在52某论坛发帖但至今无解,希望求看雪大神前来讨论。

难点分析:
1.此crackme为win32 console控制台程序(控制台程序的窗口是系统创建的,所以OD载入会自动弹出一个窗口,此时程序并没有跑飞),所以断点的设置比较困难。
2.此程序是用python语言编写,再把python脚本文件打包成EXE。程序运行后实际上是运行的python虚拟机,然后将解压的python字节码在虚拟机上运行,所以直接跑OD不能定位到关键代码(仅个人观点,不一定正确)
3.此题的目的是获取flag,而flag在哪,如何得到falg主办方没有任何提示,也就是说爆破破解后不一定会出现flag。

提示:
1.最后的flag一般是以flag{......}的形式出现(仅供参考)
2.本程序需要安装VS2015支持库才能正常运行,所以最好在实体机或者win7 32位环境下破解。

本人的思路:
1.直接逆向,不过没能解决代码定位问题。2.解包逆向pyc二进制文件,但是貌似没有得到有用的信息。(应该是正解,但是没能成功,仅供参考)


原题截图:

附件在最后:
login.rar
上传的附件:
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (21)
Jason姚 2017-1-3 22:23
2
百度云的链接在这,供非注册会员下载:http://pan.baidu.com/s/1slCktmX
rshunyino 2017-1-3 22:37
3
湖湘杯?莫非是湖南湘西?有点意思,就我知道家乡大手集中在岳阳,沅江,怀化,吉首那些地方,第一批搭建服务器的人当初玩私服传奇,但是从来没听过这类比赛在湖南举办,可惜我在医院不然会来现场看看
ID蝴蝶 2017-1-4 00:02
4
据说题目很坑。
luckxiao 2017-1-4 10:54
5
这题目正常的解法应该是python逆向。我虽然做出来了,但方法比较不可取,当时把程序拖到OD就知道是python打包的exe,但是我又没反编译过python,而且不会解包exe,时间紧迫,于是试着看能不能用最熟悉的OD调试得到flag。试了几遍后,跟小伙伴说能直接用OD把flag弄出来,最后也确实得到flag了,但过程比较艰辛。
最后得到算法如下:
50 78 76 6B 34 6B 59 63 49 56 6C 4A 53 65 4F 3F  Pxvk4kYcIVlJSeO?
Pxvk4kYcIVlJSeO?逐个跟位数异或,如P对应的16进制是50,与0异或得到50,x对应的16进制28跟1异或得到79,即字母y;v对应的16进制76跟2异或,得到74,即字母t,依次类推得到结果
50 79 74 68 30 6E 5F 64 41 5F 66 41 5F 68 41 30  Pyth0n_dA_fA_hA0
Jason姚 2017-1-4 13:46
6
不得不说看雪论坛还是比52某论坛大神多多了。

我就是想请教一下你是如何直接用OD是如何定位到关键代码的?直接搜索字符串貌似不可行。

另外我找到了逆向pyc文件无法成功的原因。就是我用的网页版pyc逆向工具,此工具只支持python2.0-2.6的pyc逆向,而无法逆向python2.7以上的pyc文件,所以关键算法没能逆向出来。
解决方案:用uncompyle6逆向pyc文件即可
luckxiao 2017-1-4 14:49
7
你在52发的帖子,我很早就看到了,但我的52帐号由于多年未登录被清理了,所以没办法回你的帖子。
我周末把过程整理下,再回你。
Jason姚 2017-1-4 16:21
8
感激不尽
luckxiao 2017-1-7 13:25
9
首先程序是双进程,要开一个OD,让程序跑起来,再开一个OD,附加另一个进程。

附加完成后,也让程序跑起来,这里要注意附加OD中,login程序的线程状态,必须是Active才能继续调试,为什么要说这个,因为我在调试的过程中,经常是挂起的状态,而且不能在OD中恢复线程。

接下来在输入用户名,回车,密码之后下内存断点,断点的位置为python35的第二个区段。然后在login中回车,程序会断下来。

断下来后在OD右下角能看到如下信息,里面有我随便输入的用户名和密码,并得知代码接下来会返回到73CB3D94。

返回后就能来的代码关键位置了,如下图,能看到很多关键信息

下图红框框中就是flag的算法

因为是比赛,不是破解软件,我只需要得到flag即可,所以一些无关紧要的跳转就不要管了让程序跳转到下面的位置,分析算法即可。

能用这种方法得到flag,我觉得也是运气,如果程序更复杂一点,或者没有一些醒目的字符串,就很难了。整个过程并不复杂,但是由于这并不是常规的exe程序,而是python打包的,所以以前常见的断点就不管用了。比赛时经过几个小时的调试,才找到算法位置,还好算法不复杂。大概过程就是这样,希望能帮到你。
上传的附件:
qqsunqiang 2017-1-7 13:40
10
谢谢楼主我看看。
Howsk 2017-1-7 18:35
11
嗯,看了您的分析,而且已经顺利获取了flag,但是有一个疑问,能否解答一下为什么要在第二个区段下内存断点呢?为什么不是第一个或者第三个呢?
goddkiller 2017-1-7 21:28
12
从输入的提示得到提示的字符串,然后整个内存搜索,你会发现,下个读断点,它只出现在python35这个模块里面,然后看地址你就知道落在哪个内存段。之后就是下断点了。

PS:这个EXE用的是pyinstall打包成的一个EXE。不过我解压完发现提取出来的main.py有问题,无法解析,估计是把头去掉或者是用改过的pyinstall来打包的。
Jason姚 2017-1-8 13:11
13
十分感谢大神的帮助,感激不尽

但是有一个地方有问题要指出来:这个程序是console类型的程序,并不是双进程。console的进程应该是系统给它创建的,负责输入和输出,而原进程将输入的数据进行处理,然后通过console窗口输出结果。
qqsunqiang 2017-1-8 18:28
14
python3.5 编译的有些反编译失败。下了支持3.5的反编译没配置好。
Howsk 2017-1-8 20:40
15
感谢解释,已经实践过并懂得了原理。
11
netwind 2017-1-8 22:43
16
感谢分享!
在附加了第二个进程后,查看模块
看到pthon模块代码段地址后,在代码窗口里直接跳转到该地址
然后搜索参考文本串 里面可以看到Password字符串 双击过去可以看到关键代码
luckxiao 2017-1-9 11:03
17
在OD中,第一个段为PE头,第二个是可执行代码段。
luckxiao 2017-1-9 11:05
18
我当时就把它当成双进程调试的,而且确确实实有两个进程,需要调试的是第二个进程。
luckxiao 2017-1-9 11:10
19
版主好
金箍棒 2017-1-9 11:44
20
http://stackoverflow.com/questions/6287918/how-to-decompile-an-exe-file-compiled-by-py2exe
shiphere 2017-2-7 17:07
21
python
11
爱琴海 2017-7-6 12:50
22


返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.014, SQL: 11 / 京ICP备10040895号-17