首页
论坛
课程
招聘
[原创]DbAPPSec CTF一道题的分析
2018-3-19 19:16 6410

[原创]DbAPPSec CTF一道题的分析

2018-3-19 19:16
6410
我一年以前去某公司面试的时候出的这道题,题做出来了但是后来没去这家公司,当时解题的过程写了博客的,现在把EXE文件也发出来和大家分享下吧。

首先运行这个程序,观察它的行为。


用exeinfo打开,发现没有加壳。


用IDA打开,查看F5反编译之后的代码。


MSDN上查阅相关函数可以得知WinMain中是一个消息循环,LoadString函数从资源里加载字符串资源到CString对象里。用Resource Hacker打开它。


这里的快捷键是?或/+ALT,按下快捷键就会弹出About窗口。在WinMain中没有看到有关flag的内容,于是在ollydbg中尝试设置消息断点。


当在程序窗口中按下ALT+?之后ollydbg断在这里。


跟进0x00401640,同时在IDA中查看。


可以看到在IDA中这一部分代码左边都是红色的,这是因为IDA没有正确识别它们。


问题出在这里,有两条重复的指令。用16进制编辑器把下面那条指令替换成nop,再在IDA中打开。


这次正常了,但是在按下F5时又出现了如图所示的提示。


依次勾选Options->General->Disassembly->Stack pointer,按下ALT+K调整堆栈。


查看F5反编译之后的结果。


0x40101E调用了0x4013A0,从0x4013A0调用的函数和0kk`d1a`55k222k 2a776jbfgd`06cjjb刚好是32位来看,这里应该是MD5加密。


跟进后面调用的0x401005,0x401005又调用了0x401590。


这里把0kk`d1a`55k222k2a776jbfgd`06cjjb和SS做了一个异或操作,编写程序来得到异或运算的结果。


对得到的结果进行MD5解密。


 这个值应该被写到00428C54也就是pbData处。


 但是WinMain会先对这里做一个memset操作,所以在LoadString函数下断点,断在这里之后memset已经执行完了,这时再在内存中写入123321。



为了能让程序顺利执行到弹出flag的地方,还需要修改前面几处跳转条件。


运行到这里,找到了flag{n0_Zu0_n0_die}。





[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 1
活跃值: 活跃值 (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5ilent 活跃值 2018-4-6 04:43
2
0
这家公司不会是杭州某安全公司吧,
雪    币: 53
活跃值: 活跃值 (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
k1ll3rQ 活跃值 2020-6-29 22:21
3
0
挺有意思的,动态分析可以发现输入是在about窗口点鼠标左中右键产生的,然后在主窗口右键触发检查输入的逻辑。最后输出flag的时候也是把密文和flag异或,输入只有0、1、2三种可能,就算输入不对也大概率能看到几个正确的字符,没用MD5都猜出来了flag。
雪    币: 53
活跃值: 活跃值 (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
k1ll3rQ 活跃值 2020-6-29 22:26
4
0
吼吼,论坛真是小,才发现最近还收藏了楼主的反调试精华帖
游客
登录 | 注册 方可回帖
返回