首页
社区
课程
招聘
[原创]看雪CTF.TSRC 2018 第六题 追凶者也 WP
发表于: 2018-12-13 01:29 5556

[原创]看雪CTF.TSRC 2018 第六题 追凶者也 WP

2018-12-13 01:29
5556

这道题通过HOOK来隐藏程序逻辑,而HOOK是在Tls回调中做的,知道Tls回调就能够发现猫腻了。

拿到题后发现是窗口程序,就打开ida找创建窗口的代码,从而找到窗口过程函数。结果发现WinMain中啥也没干:
图片描述
图片描述

于是赶紧检查WinMain之前可能执行的代码:1.调用全局对象构造的__initterm函数(未发现作者代码) 2.TLS回调(若注册了TLS回调,在IDA Exports窗口中可以看到,果然有猫腻):
图片描述

查看函数sub_401D50的代码(直接看手动重命名后的代码):
图片描述

第11行是在计算函数401120距离函数401280+9的距离:
图片描述
图片描述

之后便将计算的距离FFFFFF97保存在变量v3中,将v3和v2拼起来的按照字节序放在一起为:E9 97 FF FF FF (明显是条JMP指令啊)
第12行则修改函数401280的代码内存为可读写
接下来的循环将字节序排列的E9 97 FF FF FF写到函数401280+4的位置
很明显可以看出这是一个HOOK操作,可以通过IDA HEX View直接将401284位置的数据改为E9 97 FF FF FF看一下HOOK的目的是什么:
图片描述

原来是在这里跳转到了函数401220去执行了,而被HOOK的函数401280就是在WinMain里调用的函数,看下函数401280的功能——创建Dialog窗口:
图片描述

至此创建的窗口找到了,窗口过程也找到了,迫不及待去瞄一眼:
图片描述
图片描述
sub_401020中也啥都没有做,就不截图了

直觉告诉我这里还是有有猫腻,于是回到TlsCallback_0中继续往下看,看函数sub_401C10中做了什么:
图片描述

和上一个HOOK的操作很相似,这里HOOK的是GetDlgItemTextA+0x20位置的代码跳转到00401A10(刚好是GetDlgItemTextA函数获取用户输入后的位置!)并且将原位置的代码保存到了全局地址004147DC的位置:
图片描述

00401A10位置的代码肯定就是真正的验证代码了(具体流程看代码注释吧):
图片描述

校验1:函数00401290:
图片描述
图片描述

发现全局数组4047D0的初始数据为:4 1 3 7 2 5 8 6 0,经过函数401380的变换后数据成为:1 2 3 4 5 6 7 8 0则通过校验
并且根据for循环中的判断我们发现输入的偶数位只能是w d s a中的的一个,这不就是方向嘛!
再看看函数401380的第二个参数为输入的奇数位内容减'0',一般字符数字转为int数字会有这样的操作,所以可以判断key的规律就是方向+数字...代表那个数字向哪个方向移动

此时找到了规律就懒得分析函数401380的逻辑了,直接从数字4 1 3 7 2 5 8 6 0上找找突破:
排列一下:

这不就是一个数字拼图游戏嘛,0附近的数字可以和0交换位置:
图片描述

玩儿一把游戏,走出最短移动路线:

在验证了最短路线就是key之后,校验2的目的也明确了:限制最短路径。

验证成功后就将MessageBox的标题改为OK!内容改为success',恢复GetDlgItemTextA被HOOK的代码并调回去执行,执行完之后回到窗口回调中“假装”验证一下,便弹出MessageBox。
图片描述
图片描述
图片描述

最后再把TlsCallback_0中创建的线程看一下:
图片描述
原来是根据全局标志位4147F在GetDlgItemTextA被HOOK的代码恢复后重新HOOK


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-12-21 12:48 被KevinsBobo编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 1408
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了 好详细 感谢楼主
2019-3-21 11:49
0
游客
登录 | 注册 方可回帖
返回
//