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. 明日计划
加密与解密
- 171218 逆向-TPCTF(re200)
- 171108 逆向-SWPU(re200)
- SCTF-RE200破解笔记
- 170707 逆向-南邮CTF逆向(WxyVM1)
- 170708 逆向-南邮CTF逆向(maze)
- Rescue(逆向BFS)
- Hdu4857逃生(逆向)
- APP逆向(上)
- APP逆向(中)
- 逆向入门(一)
- 逆向
- 逆向
- 逆向
- 逆向工程(一):汇编、逆向工程基础篇
- 逆向工程(一):汇编、逆向工程基础篇
- 【逆向】逆向工厂(一):从hello world开始
- 【逆向】逆向工厂(二):静态分析技术
- OS逆向之二--逆向技术基本操作(未完成)
- 实现动态顺序表的增,删,插,改,查找,排序
- 函数的连续性
- hadoop汇总
- 华为软件测试面试题
- 笔记-劳动法理解
- 171218 逆向-TPCTF(re200)
- 线性方程组求解(高斯消元法、LU三角分解法)
- PHP-5.6.30源码编译安装
- RPC框架中服务的注册与发现
- [u3d笔记] animator 播放动画
- 2017 浙工业院赛预赛 E 小米买东西【二分+贪心】
- angularJs(五)--指令(一)
- STL-lesson001_1_模板实现Array类
- 比特币源码分析