扩展基础挑战(二)-破解扩展基础挑战一

扩展基础挑战(一)-CMD DOS INPUT用户输入漏洞

 


@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

进行代码分析可以得知,这是一个将字母转化成对应的素数后相乘的一种加密方式,例如输入abc,对应的素数就是2,3,5,因此abc的加密结果就是2*3*5也就是30。其中代码块

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

可以看出当加密结果不为1065435274时就输出验证失败。因此我们就需要破解的就是加密结果为1065435274的密码。

我们可以在:END下面加一串以下代码

Echo %PASSWORDVALUE% > %userprofile%\desktop\hash.txt

让其在判断前将用户输入的密码加密结果输出在hash.txt的文本中。

经过多次尝试你会发现有的时候hash值会是负数,这个就和整数溢出这一知识点相关了。

扩展基础挑战(二)-破解扩展基础挑战一

 也就是说当数值达到2147483647时再加1就会变成-2147483648。具体原理可自行百度。

 这边需要用到modulo(模)的概念,与数学概念的取余运算类似。

当数值界限为5的情况下,26的显示就会是1,26/5=5余1。也就是说假如界限是5,hash算出来是26但实际输出的hash值就是1。13输出的就是3。

目标hash值1065435274就是所谓的余数,而我们要做的就是找到数值界限以及经历的数值界限的次数。当数值界限个数*数值界限+输出的hash值1065435274=真实的加密结果。而这个结果是经过多个素数相乘得到的。当你得到了对应的素数就可以按照对应表得出对应的字母,也就是用户输入的密码了。

破解代码-Java

希望先自行尝试再查看代码。

上一篇:Go基础——流程控制for, if, switch, goto


下一篇:C语言goto out语句