【BUUCTF】【WEB】Unicorn shop
考点:Unicode数字字符,python的int()函数
打开题目,发现这个页面很像买东西的网站,
一共有四个商品,每个商品的价格不一样,但是第4个的商品最贵,而且超出了其他商品特别多,由此合理猜测当我们成功购买第四个商品后flag就会出现。
当我们输入4和1337后:
它提示:
Only one character allowed for price!
价格只能输入一个字符!
需要一个字符来表示1337这个数字,而在python中有一个int函数可以将字符转化为数字,由此可以猜测后端的python代码用了int函数。
Unicode 数字字符
我们平时用的数字是0-9,这只是最基本的阿拉伯数字。但在 Unicode 这个庞大的字符集里,还有成百上千个表示数字的字符。
举几个例子:
| 字符 | 是什么 | 代表的数值 | 字符长度 |
|---|---|---|---|
1 | 阿拉伯数字 1 | 1 | 1 个字符 |
Ⅰ | 罗马数字 1 | 1 | 1 个字符 |
Ⅹ | 罗马数字 10 | 10 | 1 个字符 |
Ⅽ | 罗马数字 100 | 100 | 1 个字符 |
Ⅿ | 罗马数字 1000 | 1000 | 1 个字符 |
ↂ | 罗马数字 10000 | 10000 | 1 个字符 |
፼ | 埃塞俄比亚数字 10000 | 10000 | 1 个字符 |
ↈ | 罗马数字 100000 | 100000 | 1 个字符 |
最关键的一点:Python 的int()函数能识别所有这些字符。
也就是说:
int('1')→ 1int('Ⅹ')→ 10int('Ⅿ')→ 1000int('፼')→ 10000
所以我们就拿埃塞俄比亚的፼替换1337:
成功出来了
