目录
没什么,就是最近不想学习,做下题吧,我准备学pwn结果倒好,直接卡死在安装kali的那步,其实之前是有安装好的,但是后来手贱把它删了,咋也安装不好了就,服了
一.cat's gift
(感觉这个题很新颖啊,应该不太好做就是说)
leibniz,听起来怎么这么像莱布尼兹公式呢,就是说自己虽然知道是莱布尼兹公式,但是没有一点思路,所以还是看了人家的wp
二.base64
(有点想摆烂,做点简单的题目吧)
附件就是一串编码,他都告诉你base64了,那就按照他的来吧
简单的一批!
三. flag_in_your_hand1
前端输入的加密题
这个题的难点在于分析它所给的代码
会发现每输入一次他就换一次下面的编码
浅看一下源代码
好了,感觉没有什么思路了就是说,看看大佬的wp吧
见鬼,这是一道前端输入加密的题,哦吼又没接触过,要死,看不懂,算了,一点点解吧
代码逻辑就是输入一个字符串,然后经过计算对比得到正确的flag
输入框的id=“secToken”,值保存在token变量中,先调用checkToken(token)函数检查token
查看checkToken()函数:
它在script-min.js只有这一处声明,是个假的TOKEN返回给ic变量,下面showFlag()函数也是根据ic变量的值判断输出flag的
之后的fg = bm(token);就是根据输入的字符串计算得到一个最终的结果,之后在前端最下面显示出来
注意这里的ic变量的值和fg变量的值是没有关系的,但是最终输出flag的时候他们都要求是正确的值
先求flag字符串的内容的过程:fg变量
查看bm(token)函数:
它层层嵌套,调用了3个函数str2rstr_utf8(s)、rstr()、rb()来处理输入的字符串
先看str2rstr_utf8(s)函数:
这个函数只是将我们输入的字符串转换成utf-8编码格式
直接在控制台输入str2rstr_utf8(s)函数的代码之后
str2rstr_utf8(“123”);调用函数对字符"123"处理之后输入的结果是"123"
也可以直接在chrome浏览器里面新增js代码来调用原有的str2rstr_utf8(s)函数
在chrome浏览器的Sources->Snippets中
之后就是rstr()函数:
依次调用了rstr2binl(s)、binl()、binl2rstr()函数
同样调用三个函数查看输出:
发现他们对输入字符串做了复杂的处理,
查看rstr2binl(s)函数源代码:
从代码我们可以看到根据输入的字符串,决定了输出的字符串,所以现在我们无法直接逆向这部分的代码。
接下来只能从ic变量去找突破口了,因为当我们输入的字符串是正确的字符串的时候,ic变量的值会被赋为true
可以看到ic变量的初始值被设为了false,但最后输出正确的flag的时候,要求它的值是true,所以我们去看ic变量的值在哪被更改了:
只有在ck(s)函数中有4次更改,也就是要输出正确的flag,ic的值就要在这被修改成true。
实际上ck(s)函数是被binl(x, len)调用的:
也就是上面的计算flag的值的过程中,调用了ck(s)函数去验证输入的字符串s,如果符合要求,就把ic的值设为true,然后在输出计算得到的flag。
我们接着分析ck(s)函数:
就是把输入的字符串的字符的ASCII码和a[]数组中的数逐个比较,一旦出现不是相差3的字符就返回
return ic = false;
所有的字符和数字都相差3时就返回
return ic = true;
我们根据代码逻辑,写出逆向求输入字符串的代码:
console.log(“结果是:%s”,s);
运行结果:
得到输入的字符串就是security-xbu
将字符串输入到Token输入框中