HFSEC——Crypto两道(base64 more和base64 harder)

  最近准备比赛,由于自己汇编学的不好,逆向和pwn没打算练,目前在网上各大CTF平台找web中下难度题目和Crypto题目练手,就在刚才,做web题目查阅资料时,忽然发现这个知识点应该是之前一个Crypto题目的解法,于是兴奋地找到原题目,一番折腾后终于成功了,于是就赶紧过来发泄下自己的喜悦,然后再记录下解题过程。

  HFSEC的两道Crypto题目都是深入到base编码原理的。

  第一道 base64 more

  题目:base64默认的字符表被修改过了~

HFSEC——Crypto两道(base64 more和base64 harder)

  给的是源码,仔细一看还是很好理解的,是让你get方法传入字符串,但是除非传入的是正确的flag,不然一定会输出编码后的flag。

  再看加密过程,发现出了编码表变了顺序之外,和base64原版加密没有任何不同,都是每三个字节为一组进行处理,通过左右移位,然后拼接补位处理,凑出四个字节,对应编码表输出即可,这也是base64的代码实现。

  那么就很容易了,base64解密过程也是不变的,修改后的编码表源码已经给出,直接使用这张表对给出的flag码值进行base64解密即可,需要自己编码实现,网上很多,这里就不贴代码了。

  第二题 base64 harder

  题目:这次连默认编码表都不让看了,再试试?

  HFSEC——Crypto两道(base64 more和base64 harder)

 

 

  这次的题目需要get的参数更多了,而且echo的输出也不再仅仅是flag的编码值了,而且还会输出用户传入的code的编码值,不过这次,源码里没有修改后的编码表了。

 

  还好题目给了参考文章的链接:爆破非默认base64编码表,这里的作者很详细的给我们介绍了base64编码过程以及利用逆向思维,如何反推出编码表。我按照博主的代码,成功自己反推了一遍,总结来说,他给的代码最终得到的是BaseTable表:

 

HFSEC——Crypto两道(base64 more和base64 harder)

 

 

  而这个BaseTable表,就是我们经过计算逆推代码实现的48位的一串字符串,它的作用是,可以按照作者一开始的目的,经过base64原理拼接成64位比特后,正好对应码值从0-63,那么对应的输出就是修改后的base64编码表。

 

  当时看到这儿可给我高兴坏了,这作者思路真的刁钻,还能这么破解?!不过肯定是无懈可击的逻辑,现在我们的任务就是生成这个BaseTable,作为加密的输入传给这个网站,然后网站就会自己输出他的编码表,之后我们再用第一个题目的思路来解密。

 

  问题就出在这一步,花了我一晚上加一中午的时间去尝试各种办法。

 

  产生问题的原因是,这个BaseTable里大部分是不可见ASCII码,按理说只能用二进制或者16进制等传入,但是直接?code=\x00\x.......的话,会被直接当作字符串,而不会被转义。

 

  那么我当时就想到俩方法:给这串十六进制编码;或者搜索如何使转义字符生效。

 

  过程其实很漫长很枯燥很崩溃,我尝试了编成中文,用unicode/utf-8,但是先不说会不会最终按照这种编码被解析,这些16进制也不能被变成中文,尤其是第一个\x00,这转成二进制就是0000,加到后面的二进制前面之后,就没了,它就这样没了!因为他是0,还是一串二进制前几位,所以直接被截了,可这BaseTable仨仨是一个不可分的整体,分割或者修改都会直接影响结果!

 

  然后尝试直接输入ASCII码,转码后一堆乱码,贴上去,果然不行,因为url确实不认这些,但是只要被识别了,绝对是可以成功的。

 

  之后就是php相关,如何使转义符生效,虽然最终没找到答案,但是确实学到了很多php字符串和字符串处理函数的细节,比如PHP里单引号里无视转义符(除非\\等极少用法),get方法不能传递二进制以及正则表达式等等。

 

  无奈放弃,去做web题目,好巧不巧的是,我却在搜索相关资料时,碰到了其他题目的WP:

 

HFSEC——Crypto两道(base64 more和base64 harder)

  我当时以为这就是urlencode吧,已经试过了,没用,可是当我把那串奇怪字符输入在线urlencode后,发现和WP给的结果不同!瞬间灵机一动,把base harder的网站简单复现,把那串ASCII乱码从php文件echo输入到页面上,

HFSEC——Crypto两道(base64 more和base64 harder)

 

 

 

然后按照WP的脚本去读取,果然得到了全部由%编码的编码:

HFSEC——Crypto两道(base64 more和base64 harder)

 

 

 

 

  把这一串拿出前48字节输入原网站,果然出了它的编码表,之后把这个编码表作为base64-more的编码表解密,成功得到flag:HFSEC——Crypto两道(base64 more和base64 harder)

 

 

  那么题目做完了,我马上去搜索这神奇的脚本到底读的是什么编码,结果竟然就是urlencode,可是我为什么直接在线urlencode不行呢?

 

  我马上把这串编码拿去在线urlencode区解码,解出来确实是那一串乱码,但是再点编码,却不再是原来那串url编码了。那么这个现象出现的根本原因到底是什么呢,原谅我才疏学浅,相关问题还真没怎么接触过,但可以肯定的是显示的乱码对于机器来说是有语义的,可能是不同的编码方式导致的,毕竟quote不是urlencode,不过浏览器和php都识别就是了。

 

  对于最后这个问题,如果有大佬明白的,并且可以顺便指点下小弟的,感激不尽~

 

上一篇:Cisco ASA防火墙实现IPSec 虚拟专用网,可跟做!!!


下一篇:CSS格式化 CSS代码压缩工具