2019 强网杯 pwn qwct

本文详细解析了一个存在于Linux环境中的越界读写漏洞,包括如何利用该漏洞进行程序基地址泄露,并最终实现对目标函数的劫持。

在这里插入图片描述

保护绿

环境我也不知道他当时给的多少的
我反正用的20.04

在这里插入图片描述缺点库

sudo apt-get update     #更新一下索引包
sudo apt-get install libgfapi0

然后剩下几个手动下载
具体流程可以参考一下
史上最硬核的Linux依赖问题
大概就是找到网站,手动下载安装包,然后dkpg安装

启动脚本

#!/bin/bash
./qemu-system-x86_64 -initrd ./rootfs.cpio -nographic -kernel ./vmlinuz-5.0.5-generic -L pc-bios/  -append "priority=low console=ttyS0" -device qwb -monitor /dev/null

设备叫qwb

在这里插入图片描述
函数并不多

qwb_class_init函数拿到id
在这里插入图片描述
realize看到注册了mmio,大小0x100000
在这里插入图片描述

在这里插入图片描述整个设备的结构体

mmio_write还是比较简单的
在这里插入图片描述

mmio_read
函数比较麻烦

考虑了一下还是放图分析吧
主要是用addr来进行功能的选择

addr 0
在这里插入图片描述

addr 1
在这里插入图片描述

addr 2
在这里插入图片描述

addr 3
在这里插入图片描述

addr 4
在这里插入图片描述

addr 5
在这里插入图片描述

addr 6
在这里插入图片描述

addr 7
在这里插入图片描述

addr 8
在这里插入图片描述

addr 9
在这里插入图片描述

addr 10
在这里插入图片描述

其他
在这里插入图片描述首先重点放在读上
我们发现
这里read在数组都填满的时候可以越界把后面的内容都带出来
做到越界读。

然后我们把目光看向上面那一堆乱七八糟加密里面

首先我们总结一下加密
就addr为5 6 7 8 的时候对应分别给两个指针赋值
9 10 的时候要创建线程
再次分开分析

aes_encrypt_function
在这里插入图片描述
我们发现最后会把校验值贴到output后面
其中v7是我们output的长度
所以这里其实是能造成越界写的。

aes_decrypto_function
在这里插入图片描述
同样也有越界写的问题

然后
在这里插入图片描述
这个就比较敷衍了
居然其实是一个函数

在这里插入图片描述
似乎就是一个异或
好像用处不大

然后看创建线程
在这里插入图片描述在这里插入图片描述一眼就看出来
就是分别调用crypto.decrypt crypto.encrypt两处的函数

所以我们这道题就分析完了
利用方式也应该比较明显了

通过任意读泄露程序基地址
得到system的plt表
劫持output下面那个函数
在这里插入图片描述
啊就是encrypt
在input里面写点参数
执行一下就好了

#include <assert.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/io.h>


uint32_t mmio_addr = 0xfea00000;
uint32_t mmio_size = 0x100000;
unsigned char* mmio_mem;

void die(const char* msg) {
   
   
    perror(msg);
    exit(-1<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值