挑战:代码混淆 0
下方的登录页面并未采用 HTTPS 加密传输,但它会对账号密码做混淆加密处理,因此你无法在抓包工具中直接读取明文账号密码。
你的任务:逆向破解这套混淆加密逻辑。理清加密原理后,分析提供的 pcap 抓包文件,找出真实正确的账号密码,完成登录。
你可以独立解题;如果需要解题提示,往下翻阅。
JavaScript 混淆逆向入门教程
- 在登录框输入测试账号:用户名
admin,密码 password,用 Wireshark 抓下 HTTP POST 请求数据包。
- 抓包底部会出现分行文本数据,包含两个传参字段:
xi=benjo
xp=qbttxpse
想要弄懂加密逻辑,查看网页的 HTML 源代码即可。
登录表单说明
页面登录表单中:账号输入框字段名为 id,密码输入框字段名为 pw。
点击登录按钮时,表单提交事件 onsubmit 会执行一段名为 obfuscate() 的 JavaScript 混淆加密函数。
最重要的一点就是分析 pcap 文件。
So to deobfuscate the credentials, open the pcap file and move each character one letter backwards in the alphabet to find the correct credentials.
When you get it right, you’ll be able to log in and see this page:
解题思路与步骤
这道 CTF 题目考察的是基础的前端逆向分析,由于前端代码未做任何混淆保护,加密逻辑可以轻松复现,从安全角度甚至可以衍生出多种通过方式。
第一步,随意输入账号密码抓包。

返回的响应是访问被拒绝,通过题目提示可知正确的账号密码存于客户端。

接着定位登录按钮绑定的事件,在源码中全局搜索 obfuscate。


obfuscate 函数收集的是经过 scramble 处理后的值——也就是说,浏览器最终提交了 4 个字段:混淆后的用户名、混淆后的密码、被清空的原始用户名、被清空的原始密码。真正有用的只有前两个,接下来分析 scramble 函数。


scramble 函数的意义很简单:输入一个字符串,把其中每个字符的 ASCII/Unicode 编码加 1,得到新字符串。后续解密可以由此反推。

发包逻辑、加密混淆都分析完了,接下来分析 pcap 文件。使用 certutil 将 pcap 转成十六进制:
certutil -encodehex ob0.pcap -
输入长度=751
输出长度=3477
CertUtil: -encodehex 命令成功完成。
在十六进制视图中可以看到 xi=Tuvefou&xp=Tfdsfu&id=&pw=。

第一种方式:编写解密脚本反推
已知源码规则:明文字符+1=混淆字符,那么:混淆字符-1=明文字符。
因此:
Tuvefou → Student
Tfdsfu → Secret
Python 解密代码:

运行脚本,直接得到用户名 Student、密码 Secret。

第二种方式:JS Hook 直接劫持密文
如果不想分析加解密逻辑,可以直接 Hook obfuscate 函数,让它把混淆后的值泄露出来。
Hook 代码示例:


成功登录
