171218 逆向-TPCTF(re200)

来源:互联网 发布:zdmcad辅助设计软件 编辑:程序博客网 时间:2024/06/06 09:29

1625-5 王子昂 总结《2017年12月18日》 【连续第444天总结】
A. TPCTF-来自计算机七号的挑(song)战(fen):
B.
无壳无花,只不过提示语都是中文有点蛋疼

我记得之前修复过IDAv6.8的字符显示,貌似IDA这货是不会保存配置的,除非手动改配置文件。。。

行吧,重新学习一下
Shift + f12发现仅有flag和hi, man这两句英文被找到了,中文全部丢失
双击查看发现IDA加载不出来
这里写图片描述

眼前就摆着字符串却看不到这种关键提示怎么行~
什么动态调试、断API,都是胡扯!老夫做逆向就是IDA找字符串按F5一把梭!

Ctrl + A试了一下UTF-8和UTF-16编码都不行,仍然显示不出来
查了一发资料,貌似是IDA的Bug,没有加载出系统的GBK编码
Change encoding的页面中默认还没有GBK编码,真是

于是在Change encoding页面按Insert键,输入GBK即可
然后Ctrl + A修改默认编码为GBK
上述可以使得Strings window中的乱码变为正常的中文

而代码区域的中文,则需要在IDA目录下的/cfg/ida.cfg中搜索AsciiStringChars,将(full version)下面的注释去掉(注意有一个引号缺失,自己补上,否则会报错),cp866 version的字符串加上注释即可

F5反编译得到伪代码
这里写图片描述

内部结构很清晰,对字符串异或记下跟硬编码数组比较就完了
看,逆向就是这么简单(不是

这里比较独特的是,不仅格式比较猎奇,而且取input的顺序也是不定的,并且异或的值也是打乱顺序的

没关系,正则大法好
全部代码拖入PyCharm,Ctrl + R进行替换,把格式相似的杂七杂八的字符全部删掉,精简得到形如

v2[0] ^ v8 != 239

样的式子

这个v8虽然是乱序的,但根据数字还有可以看到规律的嘛
v3就是开头赋值的那一大串乱码,从中取出某15个字符来异或

我刚开始以为v3-v17是连续排列的,于是把它们全变成了s[x]的形式(通过正则表达式来替换很方便)
然后run了一下发现不对,仔细看了一眼发现
这里写图片描述

我去~
v3-v17这些变量取值是没规律的啊

那么问题是怎么提取出这些异或的真正值了
我最先想到的就是根据这里显示的堆栈来取值,毕竟变量虽然不连续,但是堆栈是连续的,所以可以根据对v3的偏移来提取真正的值

同理,把堆栈部分复制出来,然后正则处理多余内容(一个一个删也行啊2333)
偏移170有点麻烦,因为正则里的捕获没有计算的功能,只能原样取出来
可以把它们作为字符串来跑一下提取值然后减去0x170,通过python的计算来弥补正则的处理

我懒,直接在字符串前面加170个offset然后把堆栈偏移直接作为下标就行嘞~

代码如下:

s = " "*0x170 + "C064MrRbj2hiq6F5lg28l17D75I9523O6l3FR8rkOm8NZUN4OhE7KekMq3m8VuG1SG1FUBlBl4k714w9PO3t5151OxGipc4sX9XE"q3 = s[0x170]q4 = s[0x171]q5 = s[0x173]q6 = s[0x175]q7 = s[0x177]q8 = s[0x178]q9 = s[0x180]q10 = s[0x181]q11 = s[0x183]q12 = s[0x187]q13 = s[0x18E]q14 = s[0x193]q15 = s[0x1A8]q16 = s[0x1BD]q17 = s[0x1CB]v2 = [0 for i in range(15)]v2[0] = ord(q8) ^ 239 v2[4] = ord(q11) ^ 69 v2[2] = ord(q9) ^ 28 v2[1] = ord(q7) ^ 23 v2[3] = ord(q10) ^ 56v2[9] = ord(q14) ^ 51        v2[5] = ord(q12) ^ 61v2[6] = ord(q12) ^ 45v2[7] = ord(q13) ^ 108v2[8] = ord(q15) ^ 10v2[14] = ord(q16) ^ 83           v2[10] = ord(q6) ^ 45v2[11] = ord(q4) ^ 74v2[12] = ord(q5) ^ 65v2[13] = ord(q17) ^ 25for i in v2:    print(chr((i-7)^7), end='')

本来想到的第二种方法是dump汇编下来处理出偏移的
这里写图片描述

看了一下发现还有运算,嗨呀这就太麻烦了,感谢IDA的伪代码优化~

之后看了一下出题人的WP
http://www.foxroot.cn/2017/12/08/%E4%B8%AD%E5%8E%9F%E5%B7%A5%E7%AC%AC%E5%9B%9B%E5%B1%8A%E6%A0%A1%E5%86%85%E8%B5%9BWriteUp/
发现本意是想考动态调试的
作为最开始OD入门的我现在懒到根本不想开OD的地步了(扶额

他的思路也是挺有趣的
根据异或运算的特点:0^x = x,如果v2里都是0的话,就可以从内存中dump出整理好的异或值了诶

出题人加入了三次校验来增加难度,使得无法简单地直接dump出值
应该通过爆破,即修改汇编的命令,来通过校验,这样可以继续异或,从而得到所有的值

然后再拿出比较的值来写脚本异或,不过这一步也挺麻烦的吧233又不是按顺序的

使v2全为0的方法既可以根据之前x^7;x+=7的变换来逆推出输入,也可以直接在OD中修改内存233

这个通过动态调试来暴露出比较麻烦的值的思路很有意思~也学到啦~
还有正则大法好~

C. 明日计划
加密与解密

原创粉丝点击