挑战题目
- 来源:Root-Me
- 题型:Web-Client
- 题目:Flash - Authentication
- 分数:40 Points
此题需要临时把浏览器对 Flash 限制关掉(完成后务必重新打开)。
打开 http://challenge01.root-me.org/web-client/ch20/ch20.html 页面,只有一个 flash 动画,里面只有 1、2、3、4 四个数字,通过点击数字猜测真正的密码:
解题过程
推理题。没错,这题的答案我是推理出来的。
通过连续输入某同一个数字测试发现,输入的规律如下:
- 最多输入 6 个数字,就会自动触发密码校验
- 数字 1、2、3 是有效输入
- 数字 4 从输入手感上像一个操作符
查看网页源码,可以发现在最后面隐藏了一段 JS 代码, 其作用是判断 Flash 的输出值是否等于 dbbcd6ee441aa6d2889e6e3cae6adebe
,很明显,只要我们输入某组数字得到这个值,那么这组数字就是最终密码。换言之,我们最终目标是反推 dbbcd6ee441aa6d2889e6e3cae6adebe
对应的输入值。
不难发现 dbbcd6ee441aa6d2889e6e3cae6adebe
很像一个 MD5 码,使用 MD5Online 进行解码,果然得到 6 个十六进制数 41 41 95 51 95 AA
。
只要对这段 JS 代码增加一个断点进行 DEBUG,可以在每次输入数字后,得到其对应的 MD5输出。
然后再使用 MD5 解码平台(即彩虹表,如 MD5Online )对每一次 DEBUG 得到的输出进行解码,最终我记录了这样的一个表(注意某些 MD5 码因为未被录入到彩虹表,无法解码,所以某些组合无法进行记录):
Flash输入 | 有效输入长度 | DEBUG得到的Flash输出(MD5码) | MD5解码(Hex) | 输出长度 |
---|---|---|---|---|
111111 | 6 | fb86fbf268caac98db28f43acf074761 | BA BA BA BA BA BA | 12 |
14111111 | 6.5 | ebf17f28a242305db18bb9fbc69117c0 | BA BA BA BA BA BA A | 13 |
141411111 | 6 | c730a2449b24b5e5f0eb85d475b69338 | BA BA BA BA BA AA | 12 |
144111111 | 6.5 | ebf17f28a242305db18bb9fbc69117c0 | BA BA BA BA BA BA A | 13 |
1444111111 | 6.5 | ebf17f28a242305db18bb9fbc69117c0 | BA BA BA BA BA BA A | 13 |
4111111 | 6 | fb86fbf268caac98db28f43acf074761 | BA BA BA BA BA BA | 12 |
44111111 | 6 | fb86fbf268caac98db28f43acf074761 | BA BA BA BA BA BA | 12 |
222222 | 6 | 35e479a04fc03bb46654894acf742eea | 41 41 41 41 41 41 | 12 |
24222222 | 6.5 | 5aadf0f50aede2610eeb761bf3d52ea9 | 41 41 41 41 41 41 1 | 13 |
333333 | 6 | 7e137ba035238babe49ef64259e26513 | 95 95 95 95 95 95 | 12 |
123321 | 6 | 3f25d525a24dad071f17b93a2e1896d2 | BA 41 95 95 41 BA | 12 |
123123 | 6 | 4fc9d8d098b30fd9e3a1f8042b7f38c7 | 95 41 BA 95 41 BA | 12 |
用于分析的输入的数字组合,只能使用 MD5 解码平台已收录的组合,因此无法直接穷举得到任意数字组合的 MD5 解码后的十六进制串。
通过分析输入和输出,可以得到这样的规律:
- 输入
数字1
会得到十六进制输出BA
- 输入
数字2
会得到十六进制输出41
- 输入
数字3
会得到十六进制输出95
- 改变的是输入头部,输出变化的位置是尾部,说明输出是输入的逆序
数字4
会与前一个数字进行某种运算,改变其十六进制输出数字4
前面如果没有其他数字,相当于没有数字4
(即一开始就输入数字 4 是没意义的)- 连续输入
数字4
,等价于一个数字4
- 输出长度默认是 12 ,当输入中存在的
数字4
为奇数个时(连续的数字4
看成一个),输出长度会突破到 13 - 输入
数字14
会得到十六进制输出A
- 输入
数字1414
会得到十六进制输出AA
- 输入
数字24
会得到十六进制输出1
由于最终的目标输出是 41 41 95 51 95 AA
,根据此规律已经可以知道对应的输入数字串是 2 2 3 ? 3 1414
。
又由于输入和输出顺序是相反的,逆转输入数字串顺序得到 1414 3 ? 3 2 2
。
现在剩下的问题是:输出中的十六进制 51
应该对应输入的 ?
是什么。 到这里开始只能靠脑洞联想,幸好组合情况不多。
从现象上看, 数字4
的功能是截取前一个数字的十六进制数的 【低位】 ,而当 【低位】 有两个时,在输出中又会自动合并成一个完整的十六进制数,不然无法解释输出的十六进制位数的变化情况,因此我又有以下猜测:
- (已知)输入
数字14
会得到十六进制输出A
- (已知)输入
数字1414
会得到十六进制输出AA
- (已知)输入
数字24
会得到十六进制输出1
- (推测)输入
数字2424
会得到十六进制输出11
- (推测)输入
数字34
会得到十六进制输出5
- (推测)输入
数字3434
会得到十六进制输出55
- (猜测)实际上
数字14
=A
,数字24
=1
,数字34
=5
- (猜测)因有顺逆序逻辑(但不清楚影响全局还是局部),输入
数字2434
或数字3424
会得到十六进制输出51
至此可推测,真正的密码只有两种可能: 1414 3 2434 3 2 2
或 1414 3 3424 3 2 2
。
输入测试发现,前者 141432434322
就是正确答案,完成挑战!
其实这种解法有点取巧,因为刚好真正的密码组合比较简单而已,若是更复杂一点就会因为可能性过多而无法推测了。这题更靠谱的解法是反编译 Flash 的源码进行分析:可以下载题中的 Flash 得到
RootMe.swf
文件,然后使用 SWF 反编译工具 jpexs-decompiler 查看其源码进行加密原理分析,具体分析步骤见 这里 (注意里面部分截图的说明是错的,例如 XOR 的原理,参考下思路就好) 。
答案下载
flag 下载后的 flagzip 的文件需要手动更改后缀为
*.zip
,然后解压即可(为了避免直接刷答案)