看雪安全论坛

 

 

 

 


返回   看雪安全论坛 > 看雪CTF > 『CrackMe&ReverseMe』
  登陆   注册  

发表新主题 回复
关注  
主题工具 显示模式
Jason姚
级别:2 | 在线时长:15小时 | 升级还需:6小时级别:2 | 在线时长:15小时 | 升级还需:6小时

初级会员
初级会员

资 料:
注册日期: Jul 2013
帖子: 7 Jason姚 品行端正
精华: 0
现金: 37 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
1 旧 2017-01-03, 22:22:56 icon17 已解答: 湖湘杯CTF大赛reverse(逆向)题分享
Jason姚 当前离线


如题,本人大一学生,前段时间参加湖湘杯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.png
查看次数:	36
文件大小:	21.0 KB
文件 ID :	109707
附件在最后:
login.rar.
回复时引用此帖 返回顶端
最佳答案 - 作者: luckxiao
首先程序是双进程,要开一个OD,让程序跑起来,再开一个OD,附加另一个进程。
附件 109786
附加完成后,也让程序跑起来,这里要注意附加OD中,login程序的线程状态,必须是Active才能继续调试,为什么要说这个,因为我在调试的过程中,经常是挂起的状态,而且不能在OD中恢复线程。
附件 109787
接下来在输入用户名,回车,密码之后下内存断点,断点的位置为python35的第二个区段。然后在login中回车,程序会断下来。
附件 109788
断下来后在OD右下角能看到如下信息,里面有我随便输入的用户名和密码,并得知代码接下来会返回到73CB3D94。
附件 109789
返回后就能来的代码关键位置了,如下图,能看到很多关键信息
附件 109790
下图红框框中就是flag的算法
附件 109791
因为是比赛,不是破解软件,我只需要得到flag即可,所以一些无关紧要的跳转就不要管了让程序跳转到下面的位置,分析算法即可。
附件 109792
能用这种方法得到flag,我觉得也是运气,如果程序更复杂一点,或者没有一些醒目的字符串,就很难了。整个过程并不复杂,但是由于这并不是常规的exe程序,而是python打包的,所以以前常见的断点就不管用了。比赛时经过几个小时的调试,才找到算法位置,还好算法不复杂。大概过程就是这样,希望能帮到你。
Jason姚
级别:2 | 在线时长:15小时 | 升级还需:6小时级别:2 | 在线时长:15小时 | 升级还需:6小时

初级会员
初级会员

资 料:
注册日期: Jul 2013
帖子: 7 Jason姚 品行端正
精华: 0
现金: 37 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
2 旧 2017-01-03, 22:23:58 默认
Jason姚 当前离线

百度云的链接在这,供非注册会员下载:http://pan.baidu.com/s/1slCktmX
回复时引用此帖 返回顶端
rshunyino
级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时

rshunyino 的头像

初级会员
初级会员

资 料:
注册日期: Aug 2013
帖子: 70 rshunyino 品行端正
精华: 0
现金: 11 Kx
致谢数: 0
获感谢文章数:6
获会员感谢数:9
3 旧 2017-01-03, 22:37:23 默认
rshunyino 当前离线

湖湘杯?莫非是湖南湘西?有点意思,就我知道家乡大手集中在岳阳,沅江,怀化,吉首那些地方,第一批搭建服务器的人当初玩私服传奇,但是从来没听过这类比赛在湖南举办,可惜我在医院不然会来现场看看
回复时引用此帖 返回顶端
ID蝴蝶
级别:12 | 在线时长:207小时 | 升级还需:14小时级别:12 | 在线时长:207小时 | 升级还需:14小时级别:12 | 在线时长:207小时 | 升级还需:14小时

ID蝴蝶 的头像

初级会员
初级会员

资 料:
注册日期: Nov 2013
帖子: 168 ID蝴蝶 品行端正
精华: 0
现金: 37 Kx
致谢数: 83
获感谢文章数:0
获会员感谢数:0
4 旧 2017-01-04, 00:02:44 默认
ID蝴蝶 当前离线

据说题目很坑。
回复时引用此帖 返回顶端
luckxiao
级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时

初级会员
初级会员

资 料:
注册日期: May 2007
帖子: 192 luckxiao 品行端正
精华: 0
现金: 279 Kx
致谢数: 3
获感谢文章数:3
获会员感谢数:3
5 旧 2017-01-04, 10:54:31 默认
luckxiao 当前离线

这题目正常的解法应该是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姚
级别:2 | 在线时长:15小时 | 升级还需:6小时级别:2 | 在线时长:15小时 | 升级还需:6小时

初级会员
初级会员

资 料:
注册日期: Jul 2013
帖子: 7 Jason姚 品行端正
精华: 0
现金: 37 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
6 旧 2017-01-04, 13:46:58 icon14 感谢!!!
Jason姚 当前离线

引用:
最初由 luckxiao发布 查看帖子
这题目正常的解法应该是python逆向。我虽然做出来了,但方法比较不可取,当时把程序拖到OD就知道是python打包的exe,但是我又没反编译过python,而且不会解包exe,时间紧迫,于是试着看能不能用最熟悉的OD调试得到flag。试了几遍后,跟小伙伴说能直接用OD把flag弄出来,最后也确实得...
不得不说看雪论坛还是比52某论坛大神多多了。

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

另外我找到了逆向pyc文件无法成功的原因。就是我用的网页版pyc逆向工具,此工具只支持python2.0-2.6的pyc逆向,而无法逆向python2.7以上的pyc文件,所以关键算法没能逆向出来。
解决方案:用uncompyle6逆向pyc文件即可
回复时引用此帖 返回顶端
luckxiao
级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时

初级会员
初级会员

资 料:
注册日期: May 2007
帖子: 192 luckxiao 品行端正
精华: 0
现金: 279 Kx
致谢数: 3
获感谢文章数:3
获会员感谢数:3
7 旧 2017-01-04, 14:49:58 默认
luckxiao 当前离线

你在52发的帖子,我很早就看到了,但我的52帐号由于多年未登录被清理了,所以没办法回你的帖子。
我周末把过程整理下,再回你。
回复时引用此帖 返回顶端
Jason姚
级别:2 | 在线时长:15小时 | 升级还需:6小时级别:2 | 在线时长:15小时 | 升级还需:6小时

初级会员
初级会员

资 料:
注册日期: Jul 2013
帖子: 7 Jason姚 品行端正
精华: 0
现金: 37 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
8 旧 2017-01-04, 16:21:07 icon14
Jason姚 当前离线

引用:
最初由 luckxiao发布 查看帖子
你在52发的帖子,我很早就看到了,但我的52帐号由于多年未登录被清理了,所以没办法回你的帖子。
我周末把过程整理下,再回你。
感激不尽
回复时引用此帖 返回顶端
luckxiao
级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时级别:19 | 在线时长:437小时 | 升级还需:43小时

初级会员
初级会员

资 料:
注册日期: May 2007
帖子: 192 luckxiao 品行端正
精华: 0
现金: 279 Kx
致谢数: 3
获感谢文章数:3
获会员感谢数:3
9 旧 2017-01-07, 13:25:56 默认
luckxiao 当前离线

首先程序是双进程,要开一个OD,让程序跑起来,再开一个OD,附加另一个进程。
点击图片以查看大图

图片名称:	login1.jpg
查看次数:	15
文件大小:	106.9 KB
文件 ID :	109786
附加完成后,也让程序跑起来,这里要注意附加OD中,login程序的线程状态,必须是Active才能继续调试,为什么要说这个,因为我在调试的过程中,经常是挂起的状态,而且不能在OD中恢复线程。
点击图片以查看大图

图片名称:	login2.jpg
查看次数:	6
文件大小:	73.9 KB
文件 ID :	109787
接下来在输入用户名,回车,密码之后下内存断点,断点的位置为python35的第二个区段。然后在login中回车,程序会断下来。
点击图片以查看大图

图片名称:	login3.jpg
查看次数:	7
文件大小:	105.6 KB
文件 ID :	109788
断下来后在OD右下角能看到如下信息,里面有我随便输入的用户名和密码,并得知代码接下来会返回到73CB3D94。
点击图片以查看大图

图片名称:	login4.jpg
查看次数:	5
文件大小:	102.7 KB
文件 ID :	109789
返回后就能来的代码关键位置了,如下图,能看到很多关键信息
点击图片以查看大图

图片名称:	login5.jpg
查看次数:	5
文件大小:	113.1 KB
文件 ID :	109790
下图红框框中就是flag的算法
点击图片以查看大图

图片名称:	login6.jpg
查看次数:	6
文件大小:	86.2 KB
文件 ID :	109791
因为是比赛,不是破解软件,我只需要得到flag即可,所以一些无关紧要的跳转就不要管了让程序跳转到下面的位置,分析算法即可。
点击图片以查看大图

图片名称:	login7.jpg
查看次数:	4
文件大小:	79.6 KB
文件 ID :	109792
能用这种方法得到flag,我觉得也是运气,如果程序更复杂一点,或者没有一些醒目的字符串,就很难了。整个过程并不复杂,但是由于这并不是常规的exe程序,而是python打包的,所以以前常见的断点就不管用了。比赛时经过几个小时的调试,才找到算法位置,还好算法不复杂。大概过程就是这样,希望能帮到你。
回复时引用此帖 返回顶端
qqsunqiang
级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时

qqsunqiang 的头像

初级会员
初级会员

资 料:
注册日期: Dec 2013
帖子: 174 qqsunqiang 品行端正
精华: 0
现金: 80 Kx
致谢数: 1
获感谢文章数:1
获会员感谢数:2
10 旧 2017-01-07, 13:40:38 默认
qqsunqiang 当前离线

谢谢楼主我看看。
回复时引用此帖 返回顶端
Howsk
级别:2 | 在线时长:20小时 | 升级还需:1小时级别:2 | 在线时长:20小时 | 升级还需:1小时

Howsk 的头像

初级会员
初级会员

资 料:
注册日期: Mar 2016
帖子: 31 Howsk 品行端正
精华: 0
现金: 3 Kx
致谢数: 15
获感谢文章数:0
获会员感谢数:0
11 旧 2017-01-07, 18:35:13 默认
Howsk 当前离线

嗯,看了您的分析,而且已经顺利获取了flag,但是有一个疑问,能否解答一下为什么要在第二个区段下内存断点呢?为什么不是第一个或者第三个呢?
回复时引用此帖 返回顶端
goddkiller
级别:20 | 在线时长:508小时 | 升级还需:17小时级别:20 | 在线时长:508小时 | 升级还需:17小时

初级会员
初级会员

资 料:
注册日期: Feb 2009
帖子: 316 goddkiller 品行端正
精华: 0
现金: 371 Kx
致谢数: 25
获感谢文章数:3
获会员感谢数:3
12 旧 2017-01-07, 21:28:34 默认
goddkiller 当前离线

引用:
最初由 Howsk发布 查看帖子
嗯,看了您的分析,而且已经顺利获取了flag,但是有一个疑问,能否解答一下为什么要在第二个区段下内存断点呢?为什么不是第一个或者第三个呢?
从输入的提示得到提示的字符串,然后整个内存搜索,你会发现,下个读断点,它只出现在python35这个模块里面,然后看地址你就知道落在哪个内存段。之后就是下断点了。

PS:这个EXE用的是pyinstall打包成的一个EXE。不过我解压完发现提取出来的main.py有问题,无法解析,估计是把头去掉或者是用改过的pyinstall来打包的。
此帖于 2017-01-07 21:33:32 被 goddkiller 最后编辑
回复时引用此帖 返回顶端
Jason姚
级别:2 | 在线时长:15小时 | 升级还需:6小时级别:2 | 在线时长:15小时 | 升级还需:6小时

初级会员
初级会员

资 料:
注册日期: Jul 2013
帖子: 7 Jason姚 品行端正
精华: 0
现金: 37 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
13 旧 2017-01-08, 13:11:39 icon14 再次感谢
Jason姚 当前离线

引用:
最初由 luckxiao发布 查看帖子
首先程序是双进程,要开一个OD,让程序跑起来,再开一个OD,附加另一个进程。
109786
附加完成后,也让程序跑起来,这里要注意附加OD中,login程序的线程状态,必须是Active才能继续调试,为什么要说这个,因为我在调试的过程中,经常是挂起的状态,而且不能在OD中恢复线程。
10978...
十分感谢大神的帮助,感激不尽

但是有一个地方有问题要指出来:这个程序是console类型的程序,并不是双进程。console的进程应该是系统给它创建的,负责输入和输出,而原进程将输入的数据进行处理,然后通过console窗口输出结果。
回复时引用此帖 返回顶端
qqsunqiang
级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时级别:15 | 在线时长:292小时 | 升级还需:28小时

qqsunqiang 的头像

初级会员
初级会员

资 料:
注册日期: Dec 2013
帖子: 174 qqsunqiang 品行端正
精华: 0
现金: 80 Kx
致谢数: 1
获感谢文章数:1
获会员感谢数:2
14 旧 2017-01-08, 18:28:03 默认
qqsunqiang 当前离线

python3.5 编译的有些反编译失败。下了支持3.5的反编译没配置好。
回复时引用此帖 返回顶端
Howsk
级别:2 | 在线时长:20小时 | 升级还需:1小时级别:2 | 在线时长:20小时 | 升级还需:1小时

Howsk 的头像

初级会员
初级会员

资 料:
注册日期: Mar 2016
帖子: 31 Howsk 品行端正
精华: 0
现金: 3 Kx
致谢数: 15
获感谢文章数:0
获会员感谢数:0
15 旧 2017-01-08, 20:40:23 默认
Howsk 当前离线

感谢解释,已经实践过并懂得了原理。

回复时引用此帖 返回顶端
发表新主题 回复

添加到书签

主题工具
显示模式

发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛论坛启用 vB 代码
论坛启用 表情图标

相似的主题
主题 主题作者 论坛 回复 最后发表
【招聘】C++逆向工程师 浩喆 『招聘专区』 2 2017-01-01 19:34:57
如何自学逆向 看雪迷 『软件调试逆向』 10 2016-11-13 00:45:35
【原创】ISC逆向题,破解 rshunyino 『茶余饭后』 2 2016-10-19 01:09:39


所有时间均为北京时间, 现在的时间是 01:57:47.


  ©2000-2016 看雪学院(PEdiy.com) |关于我们 | 京ICP备10040895号-17 | 知道创宇提供带宽资源 | 微信公众帐号:ikanxue