UWSP Pointer Overflow CTF
Sight Without Vision
翻译了一下
您寻求的解决方案近在咫尺。我会给你一些线索......你也有一个。你走到哪里都带着它,但它并不重。它可以是干净的,也可以是泥巴。它不会改变玫瑰的气味。您将需要这个和这个: poctf{uwsp_ _ _ }
得到 在this那里给了一个超链接
https://md5decrypt.net/en/Leet-translator/
所以flag为
poctf{uwsp_519h7_w17h0u7_v1510n}
Here You See A Passer By
得到题目下载得到附件为一张迷宫图
根据走出迷宫即可得到flag
所以flag:poctf{uwsp_pr377y_bu7_p377y_bu7_pr337y}
Better to Burn in the Light
得到题目
翻译得到
这是曾经包含多个文件的磁盘映像。不幸的是,它们在成像之前就被删除了。为了找到这面旗帜,我们需要把它们中的一些人从死里复活。这面旗帜实际上是在他们两个之间分解的。从映像中雕刻出文件并恢复任何丢失的文件头,以找到要重新组合的部分。
猜测为一个镜像取证题目
使用取证工具 AXIOMProcess
继续下一步
选择证据源'计算机'-'windows'-'加载证据'-'镜像'
然后下一步
开始分析
选择 查看所有使用痕迹类别
在媒体这里看到两张图片
poctf{uwsp_5h1v
3r_m3_71mb3r5}
但是中间的'r'和'm'比较模糊,看不清楚
这是我非预期的效果。查询wp发现其他人是通过d.docx修改文件头得到图片查看flag2的图片
我使用的工具为 RStudioPortable
导入文件扫描
这个doc文件点进去很明显看到jpg的文件格式
将其导出 补全其文件头 FFD8FFE0
得到flag2图片
继续往下滑
将m.jpg图片导出 查看其16进制发现有两个文件头,删除一个
得到flag1图片,虽然有点模糊,比前面的flag2图片好一点
poctf{uwsp_5h1v3r_m3_71mb3r5}
We Rest Upon a Single Hope
得到题目,翻译一下
我们寄托于一个希望
我是 Vinz,Vinz Clortho,Gozer 的 Keymaster。Volguus Zildrohar,Sebouillia 领主。你是看门人吗?
得到网址,是一个输入框
随便输入一个数字在url会显示?key=___ (一开始以为是sql注入,但还是习惯性的F12一下看到源码)
点击查看代码
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<META charset="utf-8"/>
<HTML>
<HEAD>
<TITLE>I dreamed a dream the other night...</TITLE>
<LINK rel="stylesheet" type="text/css" href="./static/style.css">
<SCRIPT>
function Gozer(key) {
var hash = 0, i, chr;
for (i = 0; i < key.length; i++) {
chr = key.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0;
}
return hash;
}
function conv(s) {
var a = [];
for (var n = 0, l = s.length; n < l; n ++) {
var hex = Number(s.charCodeAt(n)).toString(16);
a.push(hex);
}
return a.join('');
}
function Zuul(key) {
if (key == v) {
var Gatekeeper = [];
var y = [];
var z = [];
Gatekeeper[0] = "706f6374667b75777370";
Gatekeeper[1] = "formal";
Gatekeeper[2] = "88410";
for (var i = 0, l = Gatekeeper[0].length; i < l; i ++) {
if (i == 0 || i % 2 == 0) {
y += String.fromCharCode(parseInt((Gatekeeper[0].substring(i, i+2)), 16));
}
}
z[0] = y;
z[1] = Gatekeeper[2][3];
z[2] = Gatekeeper[2][2] + Gatekeeper[1][3];
z[3] = z[2][0] + Gatekeeper[1][5] + Gatekeeper[1][5];
z[4] = (Gatekeeper[2]/12630) + "h" + z[2][0] + (Gatekeeper[2][0]-1);
z[5] = z[4][0] + z[4][1] + '3' + Gatekeeper[1][2] + '3';
z[6] = (Gatekeeper[2]/Gatekeeper[2]) + '5';
z[7] = (Gatekeeper[2]*0) + Gatekeeper[1][0];
z[8] = (Gatekeeper[2]/12630) + "h" + '3';
z[9] = Gatekeeper[1][3] + (Gatekeeper[2]*0) + '5' + (Gatekeeper[2][0]-1);
z[10] = 'r' + '3' + z[2][0] + Gatekeeper[1][5] + '}';
console.log(z.join("_"));
} else {
console.log("Gozer the Traveler. He will come in one of the pre-chosen forms. During the rectification of the Vuldrini, the traveler came as a large and moving Torg! Then, during the third reconciliation of the last of the McKetrick supplicants, they chose a new form for him: that of a giant Slor! Many Shuvs and Zuuls knew what it was to be roasted in the depths of the Slor that day, I can tell you!");
}
}
var p = navigator.mimeTypes+navigator.doNotTrack;
var o = navigator.deviceMemory;
var c = navigator.vendor+navigator.userAgent;
var t = navigator.product+p;
var f = o+c+p;
var v = Gozer(p/((o+c)*t)+f);
</SCRIPT>
</HEAD>
<BODY>
<H1>We rest upon a single hope...</H1>
<FORM name="Gatekeeper">
<DIV>
<LABEL>Are you the Keymaster?</LABEL>
<INPUT id="key" name="key" type="password">
</DIV>
<DIV>
<INPUT id="login" type="submit" value="Submit" onclick="return Zuul(key.value)">
</DIV>
</FORM>
</BODY>
</HTML>
观察到 Gatekeeper[0] = "706f6374667b75777370" 这一段,于是hex解码一下
poctf{uwsp
于是开始读代码发现
点击查看解析
Gozer 函数:
这个函数接收一个字符串参数 key。
通过循环遍历输入字符串的每个字符,将字符的 Unicode 编码加入到一个计算的哈希值中。
最终返回计算得到的哈希值。
conv 函数:
这个函数接收一个字符串参数 s。
将输入字符串中每个字符的 Unicode 编码转换为十六进制表示,并存储在一个数组中。
返回将数组中的十六进制值连接成的字符串。
Zuul 函数:
这个函数接收一个参数 key,通常是用户输入的值。
如果输入的 key 等于之前定义的变量 v,则执行一系列操作,生成一组字符串并输出到控制台。
如果不相等,输出一段默认的文本。
加密比对过程:
在代码的末尾,通过一系列浏览器属性的值计算了一个变量 v,该值为调用 Gozer 函数计算得到的哈希值。
在 Zuul 函数中,通过比对用户输入的 key 是否等于 v,来决定是否执行一系列操作。
具体操作:
在相等的情况下,使用一个事先定义好的数组 Gatekeeper 中的值进行一些运算和拼接,最终输出一组字符串到控制台。
在不相等的情况下,输出一段默认的文本
于是我尝试直接在控制台将if (key == v)改为if (1),如下:
if (1) {
var Gatekeeper = [];
var y = [];
var z = [];
Gatekeeper[0] = "706f6374667b75777370";
Gatekeeper[1] = "formal";
Gatekeeper[2] = "88410";
for (var i = 0, l = Gatekeeper[0].length; i < l; i ++) {
if (i == 0 || i % 2 == 0) {
y += String.fromCharCode(parseInt((Gatekeeper[0].substring(i, i+2)), 16));
}
}
z[0] = y;
z[1] = Gatekeeper[2][3];
z[2] = Gatekeeper[2][2] + Gatekeeper[1][3];
z[3] = z[2][0] + Gatekeeper[1][5] + Gatekeeper[1][5];
z[4] = (Gatekeeper[2]/12630) + "h" + z[2][0] + (Gatekeeper[2][0]-1);
z[5] = z[4][0] + z[4][1] + '3' + Gatekeeper[1][2] + '3';
z[6] = (Gatekeeper[2]/Gatekeeper[2]) + '5';
z[7] = (Gatekeeper[2]*0) + Gatekeeper[1][0];
z[8] = (Gatekeeper[2]/12630) + "h" + '3';
z[9] = Gatekeeper[1][3] + (Gatekeeper[2]*0) + '5' + (Gatekeeper[2][0]-1);
z[10] = 'r' + '3' + z[2][0] + Gatekeeper[1][5] + '}';
console.log(z.join("_"));
}
效果如下
poctf{uwsp_1_4m_4ll_7h47_7h3r3_15_0f_7h3_m057_r34l}
这是非预期的效果,
我直接if(1)
将 if (key == v) 改为 if (1),实际上是将条件判断的逻辑修改为始终为真。这意味着无论用户输入什么值作为密钥,都会满足条件,因为 if (1) 始终为真。
这导致了以下情况:
首先,代码块内的操作将被执行,包括生成一组字符串并输出到控制台。
由于条件始终为真,将忽略 else 块内的代码,即默认的文本输出不会执行。
因此,当你在浏览器控制台中测试时,无论输入什么值,都会执行 if (1) 内的操作,导致输出一组字符串,这可能被认为是 "flag"。
需要注意的是,这种修改只是为了演示和测试,并不符合实际应用中的安全标准。在真实的应用中,安全验证应该依赖于实际的密钥验证逻辑,而不是硬编码为 if (1) 这样的条件。
之后我查询wp的解析
其他师傅先随便输入一个数字,通过console.log(数字)在控制台获取数值再用Zuul(数值)输出flag
通过查询
1.URL参数传递: 通过在URL中添加 ?key=随便一个数字,将一个数字作为键(key)的值传递给页面。
2.JavaScript计算: 页面加载时,JavaScript 通过获取 URL 参数的方式得到传递的数字。在你提供的代码中,这个数字被计算为 v = Gozer(p/((o+c)*t)+f),其中 p、o、c、t、f 是一些浏览器属性的信息。
3.控制台输出: 使用 console.log(v) 将计算得到的数字输出到浏览器控制台。
4.手动填入函数: 将输出的数字手动填入 Zuul 函数的调用中,例如 Zuul(输出的数字)。
5.获取 flag: 如果填入的数字满足 if (key == v) 中的条件,将执行相应的操作并输出 flag。
得到flag
最后附上加密过程
function Zuul(key) {
// 判断输入的 key 是否等于之前定义的变量 v
if (key == v) {
// 如果相等,执行以下操作
// 定义一个数组 Gatekeeper,存储一些十六进制字符串
var Gatekeeper = [];
// 定义两个空数组 y 和 z,用于存储后续处理的结果
var y = [];
var z = [];
// Gatekeeper 数组的元素赋值
Gatekeeper[0] = "706f6374667b75777370";
Gatekeeper[1] = "formal";
Gatekeeper[2] = "88410";
// 遍历 Gatekeeper[0] 中的字符
for (var i = 0, l = Gatekeeper[0].length; i < l; i++) {
// 如果是第一个字符或索引为偶数
if (i == 0 || i % 2 == 0) {
// 将两个字符的十六进制表示转换为相应的字符,然后添加到数组 y 中
y += String.fromCharCode(parseInt((Gatekeeper[0].substring(i, i + 2)), 16));
}
}
// 将处理后的字符串存储到数组 z 中的第一个元素
z[0] = y;
// 将 Gatekeeper[2] 的第四个字符存储到数组 z 中的第二个元素
z[1] = Gatekeeper[2][3];
// 将 Gatekeeper[2] 的第三个字符与 Gatekeeper[1] 的第四个字符相加,存储到数组 z 中的第三个元素
z[2] = Gatekeeper[2][2] + Gatekeeper[1][3];
// 将 z[2] 的第一个字符、Gatekeeper[1] 的第六个字符、Gatekeeper[1] 的第六个字符相加,存储到数组 z 中的第四个元素
z[3] = z[2][0] + Gatekeeper[1][5] + Gatekeeper[1][5];
// 将 Gatekeeper[2] 除以 12630 的结果加上 "h"、z[2] 的第一个字符、(Gatekeeper[2][0]-1) 的结果,存储到数组 z 中的第五个元素
z[4] = (Gatekeeper[2] / 12630) + "h" + z[2][0] + (Gatekeeper[2][0] - 1);
// 将 z[4] 的前两个字符、'3'、Gatekeeper[1] 的第三个字符、'3' 相加,存储到数组 z 中的第六个元素
z[5] = z[4][0] + z[4][1] + '3' + Gatekeeper[1][2] + '3';
// 将 Gatekeeper[2] 除以 Gatekeeper[2] 的结果加上 '5',存储到数组 z 中的第七个元素
z[6] = (Gatekeeper[2] / Gatekeeper[2]) + '5';
// 将 Gatekeeper[2] 乘以 0 加上 Gatekeeper[1] 的第一个字符,存储到数组 z 中的第八个元素
z[7] = (Gatekeeper[2] * 0) + Gatekeeper[1][0];
// 将 Gatekeeper[2] 除以 12630 的结果加上 "h"、'3',存储到数组 z 中的第九个元素
z[8] = (Gatekeeper[2] / 12630) + "h" + '3';
// 将 Gatekeeper[1] 的第四个字符、Gatekeeper[2] 乘以 0、'5'、(Gatekeeper[2][0]-1) 的结果相加,存储到数组 z 中的第十个元素
z[9] = Gatekeeper[1][3] + (Gatekeeper[2] * 0) + '5' + (Gatekeeper[2][0] - 1);
// 将 'r'、'3'、z[2] 的第一个字符、Gatekeeper[1] 的第六个字符、'}' 相加,存储到数组 z 中的第十一个元素
z[10] = 'r' + '3' + z[2][0] + Gatekeeper[1][5] + '}';
// 输出处理后的字符串,使用下划线连接数组中的元素
console.log(z.join("_"));
} else {
// 如果输入的 key 不等于 v,输出默认文本
console.log("Gozer the Traveler. He will come in one of the pre-chosen forms. During the rectification of the Vuldrini, the traveler came as a large and moving Torg! Then, during the third reconciliation of the last of the McKetrick supplicants, they chose a new form for him: that of a giant Slor! Many Shuvs and Zuuls knew what it was to be roasted in the depths of the Slor that day, I can tell you!");
}
}
Vigil of the Ceaseless Eyes
得到题目
继续翻译一下:
守夜无尽的眼睛
嘿,参赛者们!请允许我借此机会推出这个星球上最热门的新社交媒体平台。我称它为 ManyKins!它有任何漏洞的可能性也为零,这些漏洞可能允许人们找到标志(在/secret/flag.pdf下)!
在给的目录进行访问
访问不了,保存到本地strings查看得到flag
flag:poctf{uwsp_71m3_15_4n_1llu510n}
We Mighty, We Meek
得到题目,翻译一下:
我们强大,我们温顺
此 MS Excel 文档已进行文件级加密。我不得不更改文件扩展名。破解密码以找到标志。
提示:密码仅包含字母字符(A-Z、a-z)。没有数字,没有特殊字符,没有空格。
通过提示,需要对下载得到的附件进行爆破,密码为英文
在网上查询查到jhon工具对其进行爆破 教程在这:https://www.cnblogs.com/AirCrk/p/12939305.html ;https://www.cnblogs.com/Hekeats-L/p/16745318.html ,office2john.py自取
使用脚本对文件得哈希值取值
将“crack1.xls:”删除保存
然后用jhon工具进行爆破,我跑的字典是“rockyou.txt”。因为提示我将(A-Z、a-z)的密码筛选出来,和提交答案的“punct”
strings rockyou.txt | grep -v '[0-9]' rockyou.txt | grep -v '[[:punct:]]' | grep -v " " > wordlistalpha.txt
接着用jhon工具开始爆破
john.exe 目录\hash.txt --wordlist='目录\wordlistalpha.txt'
密码为 hsppyhsppyjoyjoy
(想查看换成缓存的哈希密码命令为:john.exe 目录\hash.txt --show
)
拿到flag:poctf{uwsp_j3_p3n53_d0nc_j35_5u15}
最后发现用使用Hashcat破解也可以做,看个人情况
爆破了两个半小时
Unquestioned and Unrestrained
得到题目翻译:
第一个加密挑战,所以我们必须保持简单。这是标志,但它是编码的。您所要做的就是弄清楚使用了哪种方法。幸运的是,这是一个常见的。
cG9jdGZ7dXdzcF80MTFfeTB1Ml84NDUzXzQyM184MzEwbjlfNzBfdTV9
猜测为base64,解码得到flag
poctf{uwsp_411_y0u2_8453_423_8310n9_70_u5}
Missing and Missed
点击查看代码
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++++.-.------------.+++++++++++++++++.--------------.+++++++++++++++++++++.------.++.----.---.-----------------.<<++++++++++++++++++++.-.++++++++.>>+++++++++.<<--.>>---------.++++++++++++++++++++++++.<<-----.--.>>---------.<<+++++++++.>>---------------.<<---------.++.>>.+++++++.<<--.++.+++++++.---------.+++++++..----.>>++++++++.+++++++++++++++.
得到题目,为brainfuck加密
解码得到flag:poctf{uwsp_219h7_w20n9_02_f0290773n}
If You Don't, Remember Me
翻译一下:
如果你不这样做,记住我100分
这是一个似乎存在一些问题的 PDF 文件。我不确定它曾经是什么,但这并不重要。我知道它包含标志,但我相信您可以找到它并以某种方式将其拖出文件。这是一个两步标志,因为您会发现它已部分编码。
下载 DF1.pdf
打开给的附件地址,无法正常下载需要点击右上角退出去然后选中下载
得到附件无法正常打开用srtings命令直接查看
strings DF1.pdf
得到flag:poctf(uwsp_77333163306D335F37305F3768335F39346D33}
提交发现不对 需要对其进行hex转码
得到flag为:poctf(uwsp_w31c0m3_70_7h3_94m3}
注意:里边的ctf(括号有问题,我折腾了很久最后才发现。
正确flag:poctf{uwsp_w31c0m3_70_7h3_94m3}
A Petty Wage in Regret
得到题目,继续翻译一下
后悔中的微薄工资200积分
这是一个非常有趣的图像。这面旗帜被分解成几个部分并嵌入其中,因此组装它需要各种技能。
用010打开发现
有ASCII提示,于是16进制解码
得到:::P1/2:: poctf{uwsp_7h3_w0rld_h4d
后面那段代码找了好久,后来在Stegsolve工具发现有东西或者https://www.aperisolve.com/
中间的“f”看的有点不那么明显(中间的17前面有_,折腾了好久)
得到:_17_f1257
最后flag为:poctf{uwsp_7h3_w0rld_h4d_17_f1257}