-
-
[原创]贵阳大数据及网络安全精英对抗赛Reverse EZRE_0解题
-
发表于:
2023-4-28 17:44
18632
-
[原创]贵阳大数据及网络安全精英对抗赛Reverse EZRE_0解题
贵阳大数据及网络安全精英对抗赛Reverse EZRE_0解题
昨天参加了比赛,水平太菜了,做了一下,没做出来。今天做出来了,但是不能提交了,呜呜~~~
先查壳,没有加壳,C++语言,o(* ̄▽ ̄*)
运行:
图1
有字符串提示,拖到IDA里,
定位到关键位置:
图2
大概的瞄一下函数的功能:有长度校验、错位异或、开启线程进行检测,最后通过变量判断flag是否正确。
接下来我们采用静态分析和动态调试的方式来分析。
打开x32debug,运行,输入flag:
flag{77e52c5b-b141-4f3b-92ec-aa680ca38,长度为38位,
Flag的值在一个全局变量中。
图1中第12行长度校验顺利通过,比较简单。
第18~19行对输入进行错位异或,x[i] ^= x[i+1]
调试器跟踪一下:
图3
对比一下异或前后的数据:
图4
图5
现在来分析第20行创建的线程,我们跟进去看看
图6
从函数的功能来看,函数主体调用了某个函数对数据进行进一步的变换,我们在调试器里定位到调用函数sub_f1127b处,这里先从上一步异或变换后的数据中取2个字入栈,另外还从全局的数据中取了两个字入栈(后面分析可以知道是一个key)
看一下压入的值
发现不是图5中的数据:
图7
说明在这之前又进行了变换。
回到错位异或后,在图5中对数据下硬件断点,F9
调试器中断了,来到了另一个函数中
图8
中断在第52行伪代码的位置,为了简便,这里直接从OD和IDA进行了对应。
从函数的名字来看,这个函数是一个TLS回调函数,回调函数会在创建线程的前后被调用。
通过第20行的2个参数进行过滤。
图8的函数是一个RC4的加密实现(主流加密算法也必须要熟练,不然打比赛很吃亏,哈哈),这里我们只要把密码抠出来就行了。
图9
通过调试可以知道RC4的密码是JT8U9ptt
第52行对异或后的flag值进行了RC4加密
对比一下加密前后的数据:
图10
图11
和上面的分析吻合。
接下来我们继续从图6第10行的位置开始分析
该变换函数比较复杂,
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-4-29 10:21
被chence编辑
,原因: