[Adagio for Sunmmer Wind]()
0x01 前言
- 题目下载链接:
0x02 主要函数部分
1 | int __fastcall main(__int64 a1, char **a2, char **a3) |
0x03 分析
- 通过输入
饮料的瓶数
和饮料的ID
来影响seed
的值,从而影响MD5
的值以及v12
数组的值。 - 当
MD5
值与题目所给的MD5
相同时,则v12
数组里面的值也就是正确的flag。
0x04 第一次爆破尝试
- 爆破思路, 爆破饮料的瓶数和饮料的ID。
- 但是这样会比较麻烦, 当只要一瓶饮料的时候,爆破程序比较好写,当要两瓶及以上的饮料的时候,爆破程序写起来会复杂一些。
- 比较幸运的是,这道题目正确的输入就是需要输入一瓶饮料。
1 | # -*- coding: UTF-8 -*- |
- 需要注意的是
0 ^ x = x
,所以seed == id
。 - 这样跑出来(需要在Linux下跑)的结果是,饮料瓶数输入1,ID输入59306
- 运行程序,这么输入进去就能得到flag
0x05 第二次爆破尝试
也可以直接爆破seed
脚本如下:
1 | # -*- coding: UTF-8 -*- |
0x06 第三次爆破尝试
这次的方法是借鉴的网上的WP, 这次利用的是python的
subprocess模块
。但是这个写这个脚本好像已经是确定了瓶数一定为1 ,这很玄学…
脚本如下:
1 | # -*- coding: UTF-8 -*- |
0x07 第四次爆破尝试
- 这是第三种爆破方法的变形,利用的是
pwntools
,原理和三差不多,前提依然是要先知道饮料只要1瓶,脚本如下:
1 | # -*- coding: UTF-8 -*- |
0x08 总结
- 这道题解出来还是很玄学的,为什么瓶数一定是1,确实很令人费解。
- 通过这道题目,也加强了自己写爆破脚本的能力。