BASE64编码原理分析脚本实现及逆向案例
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容。
01编码由来
数据传送时并不支持所有的字符,很多时候只支持可见字符的传送。但是数据传送不可能只传送可见字符,为解决这个问题就诞生了base64编码。base64编码将所有待编码字符转换成64个可见字符表中的字符。
02编码原理
被Base64编码之后所得到的所有字符都是在以下这个表当中的。
上表中总共有64个字符,2^6=64所以只需要6个bit位就足够描述所有的表中字符了。计算机中1个字节8个bit,一个ASCII码占1个字节。因此多出来的两位用0填充。比如我用00000110来表示表中数值为6的字符即G。
那么如何用上表中的字符来表达所有的字符呢?
Base64在编码时,首先将所有的待转换字符转成二进制的形式。
例如将”abc”转成110000111000101100011 之后在每个6位比特之前加上00也就是将3个8位字节转换成4个6位字节。
由于base64编码是将3个8位字节变成4个6位字节,因此最后所得到的字节数目一定是4的倍数,如果不是4的倍数要用=填充。
我们从一个例子当中来具体体会一下转换过程。
假设待转化的字符是 “example”
转化成二进制之后得到:
01100101 01111000 01100001 01101101 01110000 01101100 01100101
example的长度是7因此为了使得最后得到的字符是4的倍数我们要再添上两个字符
01100101 01111000 01100001 01101101 01110000 01101100 01100101 00000000 00000000
然后我们将其按照6位1字符排好
011001 010111 100001 100001 011011 010111 000001 101100 011001 010000 000000 000000
填充00之后得到
00011001 00010111 00100001 00100001 00011011 00010111 00000001 00101100 00011001 00010000 00000000 00000000
再将这些二进制转换成十进制
25 23 33 33 27 23 1 44 25 16 0 0
对照表用字符替换之后得到
ZXhhbXBsZQAA
再将最后的AA换成==即可
ZXhhbXBsZQ==
放到python中解码验证一下
03Python脚本实现
这里的解码函数只支持ASCII,如果需要支持所有的字符,可以去了解一下UTF-8 UTF-16 unicode的关系。
04逆向案例分析
这是一道在Bugku上看到的逆向题。先来执行看看:
提示输入flag,一般这种题目就要看算法了
在确认无壳之后用IDA打开分析
先打开strings窗口
找到right flag跳转
查看交叉引用
找到主要执行的部分
直接F5查看伪代码
注意到需要让Dest和Str2相同才会输出right flag
而Str2是已知的,那么就可以大概推测出需要将Str2进行某种逆运算才能知道flag。
再往上看可以看到:
将Dest每一位都进行了移位处理,再往前看关注到一个函数。
跟进查看一下
为了方便理解我已经把一些变量名重命名。
其中input为我们输入的字符串,length为输入字符串的长度。
可以看到v9首先将总长度除以3。然后在将v9*4 仔细分析之后会发现v10保存的值就是最后Dst变量的长度。这跟Base64编码前和编码后的长度关系是非常相似的。
v11变量保存了length的值作为循环的条件变量,然后将threeChar数组初始化。
在经过一个循环之后threeChar数组中存放了i个字符。
三个case分别为三种情况。case 3即i=3时,threeChar正好取了三个字符。
case 2即i=2时,threeChar只取了两个字符。case 1即i=1时,threeChar只取了一个字符。
我们先来分析case 3
首先将threeChar[0]字符右移2位,相当于只取这个字符的前6位并在6位前补上2个0。补全了之后转成了signed int也就变成了字符表中的位置。charTable就是Base64编码的字符表。
同样的道理我们再往下看。
由于刚刚threeChar[0]字符的前6位已经被取过,我们应该取threeChar[0]的后两位和threeChar[1]的前4位拼接成一个6位再补全0成8位。
这里首先将threeChar[1]与0xF0进行与运算。0xF0转成二进制是11110000,即只保留threeChar[1]的前4位后4位则置0。接着的右移操作将这4位数据移动到二进制的最低位。后边的threeChar[0]&3运算则是保留threeChar[0]的最后2位前边6位置0。
看到这里就会发现和Base64编码的原理都对应上了。另外两种情况也都是类似的分析,只不过最后的时候加了一个补全=的代码。
到此就可以写出解题脚本了。
以上是今天的全部内容,小伙伴们学会了吗?大家还想要了解什么内容,欢迎留言给我们。
BASE64编码原理分析脚本实现及逆向案例的更多相关文章
- Base64编码原理分析
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...
- Atitit.Base64编码原理与实现设计
Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...
- Base64编码原理及应用
最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压 ...
- Base64 编码原理
什么是 Base64 编码 Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密或签名通过 Base64 转换 ...
- 一篇文章彻底弄懂Base64编码原理
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...
- 一篇文章彻底弄懂Base64编码原理(转载)
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...
- 知识扩展——(转)一篇文章彻底弄懂Base64编码原理
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...
- Base64编码原理与应用
本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/a ...
- Base64编码原理
Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32.Base16编码.标准Base64编码使用的64个字符为: 这64个字符是各种字符编码(比如AS ...
随机推荐
- Fedora Linux中解决“xxx不在sudoers文件中”
问题描述: 在Fedora中执行一些操作时需要使用root权限,当我使用命令: sudo 想在普通用户中临时获得root权限时,却被提示: "xxx 不在 sudoers 文件中.此事将被报 ...
- Spring Boot整合Quartz实现定时任务表配置
最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...
- Mac下安装git
gti下载地址 https://git-scm.com/downloads 一步一步来就完事了.安装完以后执行 git version 查看是否更新到了该版本
- .net core在网关中统一配置Swagger
最近在做微服务的时候,由于我们是采用前后端分离来开发的,提供给前端的直接是Swagger,如果Swagger分布在各个API中,前端查看Swagger的时候非常不便,因此,我们试着将Swagger集中 ...
- MFC学习笔记_关于CSpinButtonCtrl
CSpinButtonCtrl使用起来比较特殊,使用起来,需要注意一些地方.实际的教程也比较少.为了让后人少走弯路,这里写这篇文章以说明.1.添加EDIT控件2.添加Spin控件如果不是这样的顺序的话 ...
- [codeforces 804F. Fake bullions]
题目大意: 传送门. 给一个n个点的有向完全图(即任意两点有且仅有一条有向边). 每一个点上有$S_i$个人,开始时其中有些人有真金块,有些人没有金块.当时刻$i$时,若$u$到$v$有边,若$u$中 ...
- BZOJ_1014_[JSOI2008]火星人prefix_splay+hash
BZOJ_1014_[JSOI2008]火星人prefix_splay+hash 题意:火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们 ...
- [Usaco2009 Jan]安全路经Travel BZOJ1576 Dijkstra+树链剖分+线段树
分析: Dijkstra求最短路树,在最短路树上进行操作,详情可见上一篇博客:http://www.cnblogs.com/Winniechen/p/9042937.html 我觉得这个东西不压行写出 ...
- 关于linux下部署JavaWeb项目,nginx负责静态资源访问,tomcat负责处理动态请求的nginx配置
1.项目的运行环境 linux版本 [root@localhost ~]# cat /proc/version Linux version -.el6.x86_64 (mockbuild@x86-.b ...
- 机器学习类别不平衡处理之欠采样(undersampling)
类别不平衡就是指分类任务中不同类别的训练样例数目差别很大的情况 常用的做法有三种,分别是1.欠采样, 2.过采样, 3.阈值移动 由于这几天做的project的target为正值的概率不到4%,且数据 ...