171021 逆向-Xp0intCTF(re300)
来源:互联网 发布:linux的vim配置文件 编辑:程序博客网 时间:2024/06/15 13:07
1625-5 王子昂 总结《2017年10月21日》 【连续第386天总结】
A. Xpoint-暨南大学校赛
B.
re300
排在最上面的就是分数最高的题目,我们就先搞它吧~
直接拖入IDA反编译,找到main函数:
虽然字符串都被重新命名了有点困难, 不过大概还是能看清楚的~
v5是input的缓冲区,送入sub_4012EF进行运算,返回值为1时就正确了
那么我们跟进去看看
这个函数对长度进行了基本校验,return 1的时候要求i==60
也就是说v3中的内容必须和且仅和407030数组的内容有60个比特相等
要输入45个字符,经过sub_401100变换后的数组长度为60,那么再看看变换函数吧:
这里其实挺明显的
v4累加
每个数相加后v4左移8位即1比特
当累加了3个数后,进行一次清空运算
给新的数组依次赋4个值,值来源于之前初始化的表v3
下标则是最有特征的地方了
累加3个数,每个数占1个字节8位,共24位
然后每次取6位赋值作为下标查表赋值
这就是base64的原理嘛,将3个8位数变为4个6位数
最后退出的时候看计数器v2是否为0,非0则说明累加器中还有多余的字符,处理后以’=’填补
那么关键在于初始化的表是否与base64相同了
这个初始化……有点烦人哦,首先分为前后两半
每一半以4个为一组进行了改变顺序的操作
因此把off_407034dump下来以后也需要照样变换一下表
这样我们就把变换算法理清了
最后要求编码字符串为off_4070300,dump下来进行逆变换就可以了
首先确定它的结尾没有’=’,(输入长度45为3的倍数,也印证了没有’=’)
然后进行逆变换
由于变换的时候是将3变4然后查表输出,因此逆变换就应该是先反查表(即以值求下标)再将4变3
写出脚本:
# 初始表d = [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47]table = [x for x in range(64)]# 前半变换顺序dic1 = {0:3, 1:1, 2:2, 3:0}# 后半变换顺序dic2 = {0:2, 1:0, 2:3, 3:1}# 结果字符串s = [90, 110, 119, 103, 90, 49, 115, 86, 102, 51, 86, 99, 81, 110, 56, 118, 88, 49, 82, 103, 80, 71, 82, 103, 102, 109, 82, 99, 86, 71, 70, 106, 80, 87, 86, 99, 100, 65, 66, 99, 102, 69, 76, 121, 100, 71, 86, 104, 100, 70, 56, 81, 90, 87, 78, 122, 80, 49, 82, 56]f = []# 初始化表for i in range(32): table[i] = d[i//4*4 + dic1[i%4]]for i in range(32, 64): table[i] = d[i//4*4 + dic2[i%4]]# print(table)# 反查下标def find(x): for i in range(64): if(table[i] == x): return il = 0for i in range(60): l += find(s[i]) # 反查表 if((i+1)%4 == 0): # 4→3 f.append((l>>(8*2))&0xff) f.append((l>>(8*1))&0xff) f.append(l&0xff) l = 0 else: l = l << 6for i in f: print(chr(i), end='')
另外要注意的地方是,两串数据在内存中实际上有偏移:
off_407030实际上是407038开始的字符串
off_407034实际上是407078开始的字符串
dump的时候注意别搞错了…
似乎是指针的样子?
总的来说这个算法比较清晰,如果熟悉b64的话会更加容易~
今天把所有放出来的Re都做完了~
不过太晚了(:з」∠)平台也关了,明天再继续写WP吧
C. 明日计划
Xpoint新生赛
- 171021 逆向-Xp0intCTF(re300)
- 171022 逆向-Xp0intCTF(Re)
- 171106 逆向-SWPU(Re300-初窥)
- 171107 逆向-SWPU(Re300-解密)
- 黑龙江省网络安全技能大赛 初赛 RE300 writeup ——Lilac 逆向组
- Xp0intCTF 2017 writeup
- 170707 逆向-南邮CTF逆向(WxyVM1)
- 170708 逆向-南邮CTF逆向(maze)
- Rescue(逆向BFS)
- Hdu4857逃生(逆向)
- APP逆向(上)
- APP逆向(中)
- 逆向入门(一)
- 逆向
- 逆向
- 逆向
- 合天网安实验室CTF练习赛之RE300
- 逆向工程(一):汇编、逆向工程基础篇
- Controller的rest服务
- 台大-林轩田老师-机器学习基石学习笔记1
- python迭代器
- JVM规范(三)内存区域
- IPicture总结
- 171021 逆向-Xp0intCTF(re300)
- WorkerMan学习篇:websocket+workerman聊天功能(三):点对点发送消息模拟(亲测可用_准备尝试着做客服接口)
- 关于canvas的移动和旋转操作
- JAVA 1.8链接Access
- JS常用正则表达式一
- mongodb整合spring之增删改查
- 基于Unity的游戏项目客户端服务器寻路同步方案
- 59个Python使用技巧,从此你的Python与众不同!
- TypeScript 学习总结