解出flag并教我复现

作成日: 2026年4月13日

使用モデル GPT-5.4 Pro by Chat01

質問

BS272.exe

解出flag并教我复现

回答

解出来了。

如果你把这题的 flag / 明文 理解成程序最终要验出来的内容,那就是:

text
Happy Birthday Buddy

如果你要的是 能过程序的 vericode,可直接用这一串:

text
3O3B5WSPEJT51UBNG4EVF075YZ2P6CQ5OQ4XOEENZXO1JTMEOCRYZEZ0J2NOHMW3QGIV

这题里 username 其实不用猜,程序把它写死成了:

text
www.51asm.com

我已经把复现脚本给你写好了: solve_bs272.py

你直接跑:

bash
python solve_bs272.py

就会输出同样的结果。

怎么还原出来的,核心就这几步:

  1. 程序先把这串常量当成 base36 大整数读进去,不是 hex:
text
A324F100182D501F6F6F78F397A3AA59641023D6A3DED8A4BF344F1E0FC71C188F4D

之所以能确定是 base36,是因为它的查表逻辑把 0-9A-Za-z 都映射成 0..35

  1. username 提示是假的。在主流程里,它没有真正读你的用户名,而是直接把 "www.51asm.com" 塞进缓冲区。

  2. 校验函数的本质是:

    • 先把 username 的原始字节按 little-endian 当成整数 U
    • E0 = U^17 mod N
    • 然后循环 100 次,检查有没有某个 i 满足:
text
vericode^(E0 + i) mod N == "Happy Birthday Buddy"

这里右边不是字符串比较的“文本输入”,而是把 Happy Birthday Buddy 的原始字节也当成 little-endian 整数去比较。

  1. 我把 N 分解后,枚举 i = 0..99,找到第一个可解的是 i = 2。于是就能按 RSA 的套路算逆元,得到对应的 vericode

你自己手工复现也很简单:

  1. 用 IDA / x64dbg 打开 BS272.exe
  2. 看主函数里那几个关键点:
    • 固定用户名的位置
    • vericode 的 base36 解析
    • 最后和 "Happy Birthday Buddy" 的比较
  3. 用脚本里的公式重算一遍
  4. 把上面的 vericode 输入进去

有个小坑:这个程序成功分支不太老实,不一定会把“flag”直接明文打印给你。最稳的验证方式是下断到比较附近,或者看结果缓冲区,你会看到它在第 3 次内部尝试(i = 2)时得到:

text
Happy Birthday Buddy

你要是愿意,我下一条可以直接把这题的“伪 C 代码版逻辑”整理给你。

このQ&Aを共有