Web 4-24实战篇
攻防世界——NaNNaNNaNNaN-Batman
题目:
1.附件没有后缀,用记事本打开后发现 script 标签,一个JS代码,不过中间乱码了。然后还是把文件后缀改为了HTML,用浏览器打开,发现
代码还是乱的,,,输入一些东西,也没有过多反应。
2.还是看不懂,然后把内容部分执行函数eval修改为alert,弹窗显示正常。
congratulation,得到
第二种方法:将代码中的eval()函数换成console.log()也可将js代码完整显示出来。
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('<input id="c"><button οnclick=$()>Ok</button>');
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)
总结:本题考查的是javascript的代码审计、正则表达式。
easy_RSA
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)
cyberpeace{125631357777427553}