Web 4-24

Web 4-24实战篇

  • 攻防世界——NaNNaNNaNNaN-Batman
    • easy_RSA

攻防世界——NaNNaNNaNNaN-Batman

题目:Web 4-24_第1张图片
1.附件没有后缀,用记事本打开后发现 script 标签,一个JS代码,不过中间乱码了。然后还是把文件后缀改为了HTML,用浏览器打开,发现
Web 4-24_第2张图片
代码还是乱的,,,输入一些东西,也没有过多反应。

2.还是看不懂,然后把内容部分执行函数eval修改为alert,弹窗显示正常。
congratulation,得到
第二种方法:将代码中的eval()函数换成console.log()也可将js代码完整显示出来。
Web 4-24_第3张图片
3.代码复制,整理。这里可以用一个在线工具,专门整理美化JS代码的。
Online JavaScript Beautifier
整理得到:

function $() {
     
    var e = document.getElementById("c").value;
    if (e.length == 16)
        if (e.match(/^be0f23/) != null)
            if (e.match(/233ac/) != null)
                if (e.match(/e98aa$/) != null)
                    if (e.match(/c7be9/) != null) {
     
                        var t = ["fl", "s_a", "i", "e}"];
                        var n = ["a", "_h0l", "n"];
                        var r = ["g{", "e", "_0"];
                        var i = ["it'", "_", "n"];
                        var s = [t, n, r, i];
                        for (var o = 0; o < 13; ++o) {
     
                            document.write(s[o % 4][0]);
                            s[o % 4].splice(0, 1)
                        }
                    }
}
document.write('');
delete _

其实就是只要输入的与几个if中一 一匹配即可。
要满足上面的if,在正则中^表示开头,$表示末尾,同时还要满足长度为16位,删除一些重复的刚刚好。
可以得出要构造一个字符串,并且满足以下条件:
长度为16
以be0f23开头
以e98aa结尾
包含233ac
包含c7be9

提交内容:be0f233ac7be98aa
得到:flag{it’s_a_h0le_in_0ne}

当然还有另一种解法:
就是直接把中间那段代码直接运行,丢给浏览器的控制台,跑出来就是flag。
或者自己写出运行结果

                        var t = ["fl", "s_a", "i", "e}"];
                        var n = ["a", "_h0l", "n"];
                        var r = ["g{", "e", "_0"];
                        var i = ["it'", "_", "n"];
                        var s = [t, n, r, i];
                        for (var o = 0; o < 13; ++o) {
     
                            document.write(s[o % 4][0]);
                            s[o % 4].splice(0, 1)

Web 4-24_第4张图片
总结:本题考查的是javascript的代码审计、正则表达式。

easy_RSA

Web 4-24_第5张图片
RSA是什么
RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制

RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
轻松学习RSA加密算法原理

解题
RSA的算法涉及三个参数,n、e、d。其中,n是两个大质数p、q的积,n的二进制表示所占用的位数,就是所谓的密钥长度。e和d是一对相关的值,e可以任意取,但要求e与(p-1)(q-1)互质;再选择d,要求
(de)mod((p-1)*(q-1))=1。(n,e),(n,d)就是密钥对。其中(n,e)为公钥,(n,d)为私钥。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^d mod n;B=A^e mod n;(公钥加密体制中,一般用公钥加密,私钥解密)e和d可以互换使用,即:A=B^d mod n;B=A^e mod n
直接给了p,q,e,求d,即为暴力破解RSA的私钥之一的d。

写脚本:

import math

#求欧拉函数f(n)
def getEuler(prime1, prime2):
    return (prime1-1)*(prime2-1)
#求私钥d
def getDkey(e,Eulervalue):#可以辗转相除法
   k=1
   while True:
      if (((Eulervalue * k) + 1) %e)== 0:
         (d,m)=divmod(Eulervalue * k + 1,e)
         return d
      #避免科学计数法最后转int失去精度
      k+=1
#求明文
def Ming(c,d,n):
   return pow(c,d,n)

if  __name__=='__main__':
   p=473398607161
   q=4511491
   d=getDkey(17, getEuler(p,q))
   print('私钥为: %d'%d)

Web 4-24_第6张图片
cyberpeace{125631357777427553}

你可能感兴趣的:(web)