经过整体分析,可以得到注册机的编写思路:(注册机大佬们都已经写过并且都分享了出来,所以在这里就不放辣~)
输入username判断合法后,用8个4byte进行一系列计算算出5个int64值。
这五个值根据最后的方程,可以求出Decode之后的password的前24byte,再在末尾加上20180000构成32位的password
将Decode过的password用题目中的字符集的进行Base64Encode,Encode过程相比原版编码方式,得出索引值之后只需要添加
tmp = index ^ (index >> 3)
就能得到正确的密码了~~~
大家好我是萌新Theme,这篇帖子是我对GSLab2018-第一题标准版的write up
这道题可以说贯穿了我的学习,自己从一无所知四处瞎学,到听说有GSLab2018组织的这场比赛,到第一次尝试没有思路,到终于做出来这道题。
这个过程里我学到了很多很多东西,无论是心理上还是技术上都比最初的自己强了不少
有不少人写过了却还写,是因为有时候大佬们的write up角度和思路非常跳跃,也就相对比较难懂,并且在对于username的结构为什么是xxxx#xxxx#...#xxxx处都没有说明。而我希望我以一个萌新的角度来写的这篇write up,能让看过的其他朋友也可以做到独立完成这道题,并且能够将所有细节弄明白~
ida打开,可以看到这是一个由MFC写的程序,而MFC程序的逆向当然要从消息处理函数入手,
于是我参考这篇文章对于消息机制的分析自己跟踪了一遍:https://blog.csdn.net/jiangqin115/article/details/48809637
在_AfxDispatchCmdMsg()函数中,OD调试就可以得到函数的位置。
根据OD里的地址,再去ida跳转到对应地址,就可以在不使用工具的情况下定位到消息处理函数
定位到之后,又会出现两个新的知识需要补充:vector和string在ida中的识别,可以看到,再它们没有被识别出来的情况下,ida中的代码非常难懂,而我在第一次尝试的时候也就自然而然的一头扎进了库函数里...结果.......嗯...
库函数的识别过程我也走了弯路:自己去跟踪调试了库函数之后,分析得出功能再进行标注(希望大家能避免这样...)
正确而高效的做法,是对照库函数的C/C++代码,然后用调试器进行调试对比,大多数库函数都有足够鲜明的标识。
而LittleNA大佬的帖子:https://bbs.pediy.com/thread-230312.htm 将这个过程讲述的非常清楚
我在学习的过程中也参考了大佬所提供的demo进行vector和string的测试,才完全成功的通过了这关,来到题干部分:
在校验之前,代码还进行了一些简单的准备操作:获得username/password/标识标准版还是进阶版的flag,这些在识别出string结构和string.assign函数之后都变得非常清晰。
所以直接来看校验部分:
username+4是string数据结构中的
Mysize成员,即字符串长度。如果不为39则错误
再使用toupper函数将username中的字母转换为大写
然后使用vector切割字符串,也就需要能够识别vector的库函数
这个函数中的代码逻辑如下:在string中查找#,并生成子字符串。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-8-30 09:34
被theme_编辑
,原因: