171021 逆向-Xp0intCTF(re300)
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 i
l = 0
for i in range(60):l += find(s[i]) # 反查表if((i+1)%4 == 0): # 4→3f.append((l>>(8*2))&0xff)f.append((l>>(8*1))&0xff)f.append(l&0xff)l = 0else: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)相关推荐
- 合天网安实验室CTF练习赛之RE300
缘由 在2016年6月的时候,我写下RE100和RE200的wp(也是52破解的申请文章,挺有纪念意义的),当时刚接触逆向,硬刚,刚出了这两题,re300是linux,没接触过linux,一开始并看不 ...
- 正向最大匹配 和逆向最大匹配对比比较
正向最大匹配法 &逆向最大匹配法 原理对比 下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配. 这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的 ...
- 同向逆向、多车道线检测
同向逆向.多车道线检测 输入输出接口 Input: (1)左右两个摄像头采集的实时图像视频分辨率(整型int) (2)左右两个摄像头采集的实时图像视频格式 (RGB,YUV,MP4等) (3)摄像头标 ...
- asp.net webform 复制窗体代码_逆向分析流氓软件自我复制以及防御思路
一.前言 好长时间没有投稿了,之前被发布的稿件,也收到了Freebuf的现金奖励,同时陆陆续续收到好多圈类人士的夸奖,备受鼓舞,觉得自己应该坚持投稿,为安全事业略尽绵薄之力!最近任务不重,正好有时间投 ...
- iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信
本文要达成如图效果,在一台iPhone上安装第二个微信: 准备: Xcode 微信ipa(可通过iTool进行下载) 重签名脚本 步骤 打开Xcode,新建Single View App项目,名字可以 ...
- iOS逆向(4)-代码注入,非越狱窃取微信密码
利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码. 在上一篇文章(APP重签名)中,已经介绍了如何对APP重签名,并且利用XCode将微信跑起来,既然 ...
- android逆向分析概述_Android存储概述
android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...
- Android逆向--如何调试smali代码?
最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...
- Android逆向之调试smali代码基础
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Android逆向中调试smali代码的方法." 最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享 ...
- c语言坐标正反算代码,C语言代码逆向的实战十篇(原创)
); } printf("\n"); system("pause"); } (之前从VS2008复制过来的时候代码有高亮的,现在换了VC6就木有了..) 进入正 ...
最新文章
- 长庆企业信息化管理课件_详解:企业信息化管理系统,不能马虎对待
- 汽车电子专业知识篇(十六)-整车电气系统设计——高压系统框架略读
- 软件定义的数据中心已经来临
- Nodejs创建简单的Bot
- Spring Boot系列教程四:配置文件详解properties
- 字节跳动mysql面试题_刚面完的字节跳动java研发面试题整理(含答案):线程+MySQL+Spring+JVM...
- opencv_haartraining.exe 分类器训练----命令执行,执行项学习(1)
- 最优化问题求解及Lingo教程
- java 排序返回索引_java数组排序和索引
- 3.2常用的调度算法
- java 米与厘米 转换_米转码换算(米与码的换算关系)
- 制造行业mes使用说明书_mes系统操作手册完整版
- jira 工作日志导出 工具
- 通过 TensorFlow 实现 AI 语音降噪提升 QQ 音视频通话质量
- 安卓平台中国眼实时视频软件之视频源分析
- rtsp h256 流 web 软解播放
- java模糊查询、自动补全的实现
- 【多图】【严肃的技术帖】用UE4做黑丝材质
- 直播代码开发人员必须懂
- 成都大学生接连遭遇购物网“被注册” 疑信息泄露