Write up PHP_encrypt_1_Bugku
https://ctf.bugku.com/challenges#PHP_encrypt_1(ISCCCTF)
先看题目,给了一段base64密文和一个php文件。
用txt打开是一段PHP加密代码:
首先搞清楚黑盒的输入和输出:
Fun(key,data) à Str
其中key=MD5(“ISCC”),Str也已经在题目中给出了:
fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
所以推测data就是我们需要的flag;再来看黑盒中做了什么事情,黑盒里主要做了三件事:
Char=key+key[:6]
Str[i]=(data[i]+char[i])%128
Return base64-encode(Str)
第一步和第三步中我们可以分别通过key的值和base64密文来得到Char和Str,所以我们只要解决了最重要的第二步就能得到flag(即data)了。
接下来的内容需要对ASCII码和取余符号有一些了解,我简单解释一下会用到的部分:
ASCII码分为不可见字符和可见字符一共128个字符,不可见字符范围为0-31,可见字符为32-127,其中’0’-‘9’对应的十进制ASCII码为48-57,’A’-‘Z’为65-90,’a’-‘z’为97-122。
X%Y à X>Y?X-n*Y:X
知道了这些知识后,再回来看这个题。一般来说,取余符号的运算是不可逆的,但是在这里就不一样了,因为单个ASCII码%128还是它本身,而Str[i]为两个ASCII码的和取余128,所以data[i]+char[i]的范围就是0-254,再考虑到不可见字符范围就缩小到了64-254,再一做取余运算就被分成了两部分
一部分是始终不大于128的,另一部分是取余前大于128的。
前一部分我们在回溯的时候就很简单,主要是后一部分,后一部分的范围是0-127,与一个ASCII码范围无二,所以很难分辨,这时候ASCII码非可见字符就可以帮我们筛选掉很大一部分。
一共38个字符,被非可见字符过滤掉28个,这28个字符都是属于第二部分的,但是第二部分还有一部分我们没有确定,就是那些范围为(65-127)的,这一部分我们可以利用char来发现他们,即 对于范围在64-127的字符,如果属于第二部分,那么在str[i]-char[i]那一步就会因为char[i]比str[i]大而报错。知道了以上信息我们就可以开始写脚本了。
End-----
- 【Bugku】这是一张单纯的图片?? 【writeup】
- 【bugku】做个游戏 writeup
- 【伪随机数】【搜索】【RE】【bugku】mountainclimbing WriteUp
- BugkuCTF~代码审计~WriteUp
- bugku web题1~8 write up
- bugku 中 web 矛盾 writeup
- [Bugku]密码???[writeup]
- Natas Wargame Level26 Writeup(PHP对象注入)
- Bugku WEB题 WriteUp
- 【bugku】【ZSCTF】【迷宫RE】Take The Maze WriteUp
- bugku 部分writeup
- 【bugku】 cookies欺骗 writeup
- Bugku CTF flag.php WriteUp
- bugku web 17~24 write up
- BUGKU web--writeup
- 【bugku】 PHP_encrypt_1(ISCCCTF) writeup
- bugku杂项几题writeup
- Wechall PHP Writeup
- (未完)Writeup of Take the maze (reverse) in BugKu