题目来源
NSSCTF-2023-misc-gift_in_qrcode(revenge)
考点
getrandbits(8) python伪随机数 爆破脚本的编写
题目内容
main.py
1 | import qrcode |
nc连上去,会给一长串的base64数据,然后要求输入answer。
分析
- 首先是生成reveal的地方,还有target[也就是我们最后要求的answer]
secret_seed = randrange(1, 1000) seed(secret_seed) reveal = [] for i in range(20): reveal.append(str(getrandbits(8))) target = getrandbits(8) reveal = ",".join(reveal)
- 先用getrandbits(8)生成了20个数字,放到reveal里面了,然后又生成了target,所以我们的思路就是利用伪随机数的原理,通过那20个数去爆破第21位
- 而题目后面的内容就是把这20个数据的信息生成一个二维码再把信息的base64编码输出给我们,所以还需要一个脚本把这个二维码还原出来。
解答
首先是二维码的还原
1 | #!/usr/bin/env python |
生成的二维码直接扫描就得到数据,接下来就是考虑编写脚本爆破。
思路就是:把已知的20个数值传上去,然后用循环开始执行随机生成seed和getrandbits(8),当找到匹配的结果之后就继续下一位,直到20个数值全部匹配成功,就说明找到了那个序列,就直接再执行一次输出第21位的值。
脚本
1 | #!/usr/bin/env python |