Challenge
The following is a batch script authentication system. Your goal here is to get the batch script to authenticate you by inputting a password into the field. For this extbasic, your goal is to circumvent authentication altogether. Decrypting the password is for extbasic11.
关卡给出一个 Windows batch 认证脚本,要求输入内容使脚本认证通过。本关的目标是绕过认证。
关卡页把脚本正文放在 <code> 块里:
@ECHO OFFSETLOCAL ENABLEDELAYEDEXPANSIONSET PRIME=2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101SET CHARS=a b c d e f g h i j k l m n o p q r s t u v w x y zSET PASSWORDVALUE=1SET INPUT=SET /P INPUT=Insert password:IF "%INPUT%"=="" "%~0"ECHO Authenticating...:OVERLOOPSET CURRENTPOSITION=0:SUBLOOPIF /I "!INPUT:~%CHARACTERPOSITION%,1!"=="!CHARS:~%CURRENTPOSITION%,1!" SET /A PASSWORDVALUE*=!PRIME:~%CURRENTPOSITION%,3!SET /A CURRENTPOSITION+=3IF NOT %CURRENTPOSITION%==78 GOTO :SUBLOOPSET /A CHARACTERPOSITION+=1IF NOT "!INPUT:~%CHARACTERPOSITION%,1!"=="" GOTO :OVERLOOP:ENDENDLOCAL&IF NOT %PASSWORDVALUE%==1065435274 GOTO :ACCESSDENIEDECHO You have been authenticated. Welcome aboard!GOTO :SILENTPAUSE:ACCESSDENIEDECHO Access denied!:SILENTPAUSEPAUSE > NULSolution
PRIME 和 CHARS 都按 3 个字符一项排列。内层循环依次取 0、3、6 直到 75,将输入字符映射到 2 到 101 的质数;命中后执行:
SET /A PASSWORDVALUE*=对应质数最终判定要求 PASSWORDVALUE 等于 1065435274。该值的分解为:
1065435274 = 2 × 6827 × 780316827 和 78031 不在脚本的质数表中,因此按原有乘法路径无法得到目标值。可利用点在输入处理,而非乘积本身。
认证前的判断直接把原始输入拼进双引号:
IF "%INPUT%"=="" "%~0"输入未经过转义,可以闭合字符串并追加命令。使用以下 payload:
"=="" set passwordvalue=1065435274 && goto :end abc代入后得到:
IF ""=="" set passwordvalue=1065435274 && goto :end abc"=="" "%~0"""=="" 成立,set passwordvalue=1065435274 将累积值直接设为目标值,goto :end 跳过整个乘法循环。set 的变量名不区分大小写,所以这里的 passwordvalue 与脚本中的 PASSWORDVALUE 相同。
到达 :END 后,判定行中的 %PASSWORDVALUE% 会在整行执行前展开,早于 ENDLOCAL:
ENDLOCAL&IF NOT %PASSWORDVALUE%==1065435274 GOTO :ACCESSDENIED此时展开结果为 1065435274==1065435274,IF NOT 条件为假,执行流进入认证成功分支。