-
-
[原创]CTF第三题
-
发表于:
2017-10-29 23:36
8647
-
修改随机基址,改为固定基址。
先过反调试。至少能输入字符串。为了不改变程序执行流程,只要把jnz该jz就好了。修改反调调试验证函数的返回值。
反调试一定要跟到函数里面看一看,谁知道在函数外边判断钱作者在里面做了什么
IDA + OD发现现输入被重新编码至少两次(后来发现有4次)

进入encode函数内部,观察编码逻辑。

。

随便使用一段base64字符
QmFzZTY057yW56CB6KaB5rGC5oqKM+S4qjjkvY3lrZfoioLvvIgzKjg9MjTvvInovazljJbkuLo05LiqNuS9jeeahOWtl+iKgu+8iDQqNj0yNO+8ie+8jOS5i+WQjuWcqDbkvY3nmoTliY3pnaLooaXkuKTkuKow77yM5b2i5oiQ
长一点否则两次编码以后长度会急剧缩短,第二次编码以后竟然给编码没了。
之后的反调试我也看了看,没发现做什么手脚所以就直接nop了,而不是修改跳转。
前面几轮编码都是一路过反调试,没意思就不多谈了。



eax=0018E058 "de5909376cf44e85fbb3886506a393022cbc8b3dcbdbc610911b7f12712a9810"
尽然还计算长度,算毛啊64个字节


试一试将de5909376cf44e85fbb3886506a393022cbc8b3dcbdbc610911b7f12712a9810作为作为输入
此时验证值变为
eax=0018E058 "e1869e48114c9f10c8c997263b8e387dbf9c555c67323d4fa1ba5506882e722a"
我突然有一个想法,如果 两个串存放的位置相聚不远那么我输入
xxxxx 会的到bbbbb。我可以输入xxxxxhhhhhhbbbbb,将验证的值覆盖诚bbbbbb,由于发生了截断,他只会发现xxxxxx,对xxxxx做运算得bbbbb。
结果两个值相隔好远啊。这个办法不通。
如果输入A1那么自然有B1与之对应。在输入B1有C1与之对应。
而集合是有限的。如果存在有且仅有唯一解,这个解假设为输入D1运算完毕以后依然是D1=F(D1)。那么集合剩下的数子为了不产生x=f(x),只能形成一些或大或小的循环,或者收敛于D1。如果存在唯一D1,接下来就看f(x)如何做到这一点。有点感觉是两个图像在区间上的焦点问题,A(x) = x与B(x)是一个定义域值域都为{Hex64}的有限集合。要找的是两个图像的焦点。知道B(x)满足,B(B(B(….))) – x = 0有且仅有一个解。所以求导,分三种情况讨论....要么逆向算法。要么暴力呵呵。
那么狠有可能就是之前计算两次长度哪里有问题。

果然当我们输入AAAAAAAxxxxxxxxxxxxxxxxxxx的时候。根据其AAAAAAA会计算出一个值
ccccccccccccccccccccc。那么下次我们只要输入AAAAAccccccccccccc的值就好了。
按照前面的分析,想要攻破要么逆向算法,要么暴力,这显然是行不通的。我怀疑这里是作者故意留的。
如果此时就能得到正确答案题目必然会多解。作者为了避免多解不得不在后面做一些验证检查然。此时距离MessageBox函数只有两个函数了。
也就是说为了保证输入唯一,作者必定在接下来的两个函数中对输入做一次验证。
接下来输入aaaaaaa
得到432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513
只要输入aaaaaaa432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513就可以通过memcpy的验证。

果然,这里又来藏了点东西弄了一个除零异常,注册了一个函数。好气啊。除零,
X32Debug放不走除零异常,等等好像x32Debug能放走除零异常我跟过来了。但是好像什么都没做,只是修改了堆栈。

这里果然有问题。好烦啊,又是反调试。


作者代码可能写的又问题。最后连两个函数在我的调试过程中完全没有起到作用。
一路f7竟然过了。这道题肯定多解了。
后来我试了几次,程序在调试的时候单步跟是能过的。运行的有时候有时候不能。单步能过,不但不就过不了。
[注意]看雪招聘,专注安全领域的专业人才平台!