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新生赛

原创粉丝点击