吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3239|回复: 8
收起左侧

[CTF] 【2022春节】解题领红包windows(二、三)和web解题过程

  [复制链接]
pandamon 发表于 2022-2-16 09:25
本帖最后由 pandamon 于 2022-2-16 09:58 编辑

解题领红包之二 {Windows 初级题}

查壳,无壳
0.PNG
运行程序看一下
1.png
拖进od,搜字符串,找到please input password,以及附近的tip: flag长度为23
2.png
双击please input password,在该处硬件断点,运行
3.PNG
堆栈窗口看到字符串,长度也为23,可能就是flag
4.PNG
试输入,正确,得到flag为2022HappyNewYear52PoJie
5.PNG





解题领红包之三 {Windows 中级题}

查壳,可能是有修改的upx,要先脱壳
6.PNG
先用52虚拟机脱壳,拖进od,走一步,ESP定律,在ESP寄存器上右键,数据窗口中跟随
7.PNG
然后右键,断点-硬件访问-byte
8.PNG
然后运行程序,停在4240C6,上面是popad,下面不远处一个大jmp,推测接近OEP
9.PNG
运行到4240D3该jmp处,然后单步一次,到40B37B的push处,应为OEP
10.PNG
Ollydump脱壳
11.PNG
脱壳结果ExeinfoPE看不出,用PEID看应该是脱了
12.PNG
运行程序看一下
13.PNG
拖回实机上的IDA,看流程,首先是Input your UID:,然后到Input your Key:,最后根据某种判断条件跳到Success或Error。
14.PNG
15.PNG
在Success处F5得到伪代码,显然地,sub_401520内有判定flag是否正确的条件
16.PNG
双击点进sub_401520,它的返回值以v8变量为判断条件决定返回值为0或1
17.PNG

[C++] 纯文本查看 复制代码
 if ( v8 )
{
//省略其他代码
return 0;
}
else
{
//省略其他代码
return 1;
}


上面代码省略处为与分析返回值逻辑关系不大的代码,太长截不了图用文字表示
根据以上条件可知需要sub_401520返回1,就需要v8=sub_403ED0的返回值为0
双击点进sub_403ED0,看到以下和返回值有关的代码
18.PNG
因为需要返回值为0,根据该逻辑就需要memcmp返回0,且v5==v3
接下来在IDA中进行动态调试,先在伪代码17、18、20行下断点,输入我的UID,在key处我随便输了个114514,停在17行。鼠标放在v4变量上能看到疑似flag:flag{Happy_New_Year_52Pojie_2022}
19.PNG
停止调试重新运行程序,但测试发现flag不对
20.PNG
继续看IDA,在第17行的第一个参数处拆分内存访问
21.PNG
得到新的伪代码如下图所示
22.PNG
在新伪代码的22行下断点,在IDA中运行,输入UID和key:flag{Happy_New_Year_52Pojie_2022},停在伪代码22行后查看变量v7为ikpr{Apuux_Czf_Xzpm_52Ulsjz_2022},v4仍为flag{Happy_New_Year_52Pojie_2022}
23.PNG
推测v7的值是对输入的flag{Happy_New_Year_52Pojie_2022}的字母部分做了某种变换,遂输入与flag等长的连续33个a,得到v7为连续33个p,故推测该变换与其为何种字母有关,与其在字符串中的位置无关。
为了获得该变换的规则,输入abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ,得到v7为pyhqzirajsbkctludmvenwfoxgPYHQZIRAJSBKCTLUDMVENWFOXG
24.PNG
从而得到了变换规则,将之前找到的flag{Happy_New_Year_52Pojie_2022}进行逆变换,得到wohz{Chaab_Utv_Bthg_52Axift_2022},测试显示success,为正确flag
25.PNG





解题领红包之番外篇 {Web 中级题}
用fiddler打开52tube.saz,把文件保存出来
26.PNG
/api/drm/包含疑似密钥为32byte,但m3u8里是AES-128加密,应是16byte的密钥,此处不对,先看js,查找“/api/drm/”字符串,相关代码如下所示

[JavaScript] 纯文本查看 复制代码
 let e = "/api/ping/", i = "/api/drm/";
function n(t)
{
return [...new Uint8Array(t)].map((t => t.toString(16).padStart(2, "0"))).join("")
}
function s(t, e)
{
let r = new Uint8Array(t.length);
for (let i = 0; i < t.length; i++) {
r[i] = t[i]^e[i];
}
return r
}
class a extends t.DefaultConfig.loader
{
constructor(t)
{
super (t);
var r = this.load.bind(this);
this.load = function (t, a, o)
{
if (t && t.url.startsWith("key://"))
{
let r = t.url.substr(6);
t.url = e;
var l = o.onSuccess;
o.onSuccess = function (t, e, a)
{
(async function (t)
{
let e = await async function ()
{
let t = new Uint8Array(16);
crypto.getRandomValues(t);
let e = n(t.buffer) + Date.now() + Math.random();
return new Uint8Array((await async function (t)
{
const e = (new TextEncoder).encode(t);
return await crypto.subtle.digest("SHA-256", e)
}
(e)).slice(0, 16))
}();
var r = new URLSearchParams;
r.append("h", n(e.buffer)), r.append("id", t);
var a = {
method : "POST", headers : {
"Content-Type" : "application/x-www-form-urlencoded"
},
body : r
};
let o = await fetch(i, a), l = await o.arrayBuffer();
if (32 !== l.byteLength) {
throw new Error("Invalid response");
}
let u = new Uint8Array(l.slice(0, 16)), c = new Uint8Array(l.slice(16,
32));
return s(s(u, e), c);
})(r).then((t => {
l({
data : t.buffer
}, e, a)
}))
}
}
r(t, a, o)
}
}
}


显然,s(t,e)是一个按位异或,return s(s(u, e), c);可能为解密密钥
let u = new Uint8Array(l.slice(0, 16)), c = new Uint8Array(l.slice(16, 32)); 处可看出32byte密钥的前半部分为u,后半部分为c
var r = new URLSearchParams;  r.append("h", n(e.buffer)), r.append("id", t); 处可看出e为URL参数h,在fiddler的/api/drm/处可找到
27.PNG
u=08a5e6c2c261a8acb4d79c49af160a3a
c=da4e5ceae16fed46eb6f498c9b63d53b
e=7b10311e6e310f0df068d9ede10475a8
解密密钥为u异或e异或c= a9fb8b364d3f4ae7afd00c28d571aaa9
然后找了个现成的ts解密工具(ts助手)解密得到mp4,播放mp4视频得到flag{like_sub_52tube}
28.PNG



我太菜,安卓题没做出来,今后需要继续学习

免费评分

参与人数 6威望 +1 吾爱币 +24 热心值 +5 收起 理由
yang10560 + 1 我很赞同!
丶月落 + 1 + 1 谢谢@Thanks!
cxkd + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
艹123 + 1 + 1 我很赞同!
jinyi666 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

seawaycao 发表于 2022-2-16 12:21
谢谢分享!学习了。已收藏。
jinyi666 发表于 2022-2-16 13:48
NINE09 发表于 2022-2-17 08:12
丶月落 发表于 2022-2-19 20:12
大佬,请问拆分内存访问是干什么的= =
 楼主| pandamon 发表于 2022-2-19 23:54
丶月落 发表于 2022-2-19 20:12
大佬,请问拆分内存访问是干什么的= =

ida最开始生成的反编译代码在该处是一个指针,在该处断下的时候不能直接看出该处的值,用这个功能就可以在反编译代码里把它变成一个变量,鼠标放上去就能直接的看到值
丶月落 发表于 2022-2-20 14:41
pandamon 发表于 2022-2-19 23:54
ida最开始生成的反编译代码在该处是一个指针,在该处断下的时候不能直接看出该处的值,用这个功能就可以 ...

哦哦懂了,感谢,一开始还没找到这个功能,后来才发现是版本太低了没有hhh
qwy1516584235 发表于 2022-2-23 16:49
谢谢分享!学习了
老艺术家 发表于 2022-2-24 10:37
方便分享下ts助手吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-25 14:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表