标签:SET hash GOTO 挑战 扩展 1065435274 基础 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=真实的加密结果。而这个结果是经过多个素数相乘得到的。当你得到了对应的素数就可以按照对应表得出对应的字母,也就是用户输入的密码了。
希望先自行尝试再查看代码。
标签:SET,hash,GOTO,挑战,扩展,1065435274,基础,INPUT,加密 来源: https://blog.csdn.net/hx765287443/article/details/120326411
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。