Kernel Pwn初探
终于开始入门心心念念的kernel pwn了💘,之前比赛遇到kernel连环境都起不来😭
环境搭建
本人使用的Linux版本如下:
安装依赖
1apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc libelf-dev flex bison
后面如果编译时出现依赖缺少的报错,根据报错再安装对应的依赖
下载Linux源码
123apt install curlcd Desktopcurl -O -L https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.169.tar.xz
下载Linxu源码的地址:https://cdn.kernel.org/pub/linux/kernel/
解压缩后进入到源码目录中
配置编译选项
1make menuconfig
执行此命令会出现以下界面
需要设置几个选项
12Kernel hacking -> Compile-time checks and compiler optio ...
2024春秋杯夏季赛Pwn
CTF-Shuffled_Execution
题目分析
开了这么多沙盒保护,正常的ORW都被ban了,open可以用openat替代,read可以用mmap替代,write可以用writev替代,所以思路就是调用openat、mmap、writev即可
注意这个strlen,用’\x00’截断绕过即可。
EXP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import *from pwn import u64,u32,p64,p32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux", ...
2024ciscn华中分区赛部分题解
baby_jit
程序禁用了execve,所以需要ORW读
代码分析
程序两个功能,一个add功能,一个exec功能。
add
add功能实际上就是创建一个堆区保存输入的内容,然后复制到dest中。没有发生溢出
exec
exec函数实际上就是mmap出了一个可读可写可执行的区域,然后经过赋值的操作最后跳转跳转过去执行。
注意观察 v7 = ((v2 + 0x100000))();
这一步实际上就是call rdx到mmap申请的区域执行,v2的值是根据上面的 v2 = (atof(s) * 12.0)得来的。通过控制输入的offset值就能控制call rdx的位置。
所以接下来的目的是将shellcode读入到mmap内存中去。
v5 = strtoull(s1 + 4, &endptr, 10);
这一步是处理我们add功能输入的内容。如果我们控制输入的内容为"add 144",那么这个函数就会将字符串形式的144转化为144整数保存到v6区域(mmap申请的可读可写可执行内存)中,也就是会保存为’\x90’,也就是nop。所以同理,如果我们在 ...
2024ciscn华中分区赛部分题解
note
最简单的一道题
fix
delete功能中存在UAF,直接free nop掉即可过check。
break
普通的glibc-2.31版本的UAF,直接打tcachebin申请到free_hook触发system。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091from pwn import *from pwn import u64,u32,p64,p32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64', log_level='debug ...
Protobuf Pwn
Protobuf Pwn
protobuf
Protobuf(Protocol Buffers)是谷歌开发的一款跟平台和语言无关、可扩展、轻量级高效的序列化的结构类型。是一种高效的数据压缩编码方式,可用于通信协议,数据存储等。
能够将数据结构体序列化为bytes字节流,也能将bytes字节流反序列化成数据结构体。
安装protobuf
1234567891011121314#在ubuntu22.04下git clone -b v3.21.0 https://github.com/protocolbuffers/protobuf.git # 需要大于3.20,不然后面会出现依赖问题sudo apt-get install autoconf automake libtool curl make g++ unzip # 所需依赖sudo ./autogen.sh # 生成配置脚本sudo ./configure # 可选 --prefix=path ,默认路径为/usr/local/make -j`nproc` sudo make install protoc - ...
第一届长城杯决赛pwn部分题解
SandBoxShell
开了沙盒保护,禁用了execve
打ORW链
123456789101112131415161718192021222324252627282930313233343536373839404142434445from pwn import *from pwn import u64,u32,p64,p32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux", "splitw", "-h"]debug = 1if debug: p = process('./pwn') elf = ELF('./pwn') # ...
2024H&NCTF
Appetizers_
由于是根据system调用mmap系统调用,所以mmap映射的内存区域距离libc的偏移是固定的。
read读取的最低字节是异或的,高8字节是对于mmap映射区域的偏移。
因为偏移是固定的,所以就能先利用这个异或修改内存,将IO_stdout的write_ptr或者write_base修改一个高位字节,然后调用puts时,就会触发IO流输出write_ptr和write_base中间的内容。可以将libc地址以及stack地址都泄露出来。
因为开启了沙盒,并且关闭标准输入流和输出流,那么正常的ORW是读不到终端的。那么就利用socket系统调用,然后connect连接到VPS,write写到VPS上。
利用这个循环read,读/flag,以及ip和port和ORW链到mmap映射出的内存上。然后修改栈上的rbp和ret。控制rbp为ORW-8。控制ret为leave_ret。
修改leave_ret简单,将ret内容最低字节修改,即可控制为text段中的leave_ret。然后修改rbp栈迁移后就能跳转执行ORW。
其中ip_port需要进行编码一下。
123 ...
IOT-WiFi协议
前言
物联网核心在人、机、云之间的信息互联,因此智能设备、云端、手机端回通过各种协议进行数据的交换
物联网通信协议
通信协议分类:接入类协议 通信类协议
接入类协议:一般负责子网内设备间的组网及通信,市场上常见的有zigbee、蓝牙以及wifi协议等
通信类协议:主要是运行在传统互联网TCP/IP协议之上的设备远程通讯协议,负责设备通过互联网进行数据交换及通信,例如GPRS/3G/4G等。
wifi协议
wlan
wlan指的是无线局域网络(Wireless Local Area Networks)。它是相当便利的数据传输系统,它利用射频(Radio Frequency;RF)的技术,使用电磁波来取代旧式的双绞铜线(Coaxial)所构成的局域网络,在空中进行通信连接;该技术的出现绝不是用来取代有线局域网络,而是用来弥补有线局域网络之不足,以达到网络延伸的目的,使得无线局域网络能利用简单的存取架构让用户透过它,实现无网线、无距离限制的通畅网络。
wifi
Wi-Fi又称作“行动热点”,是Wi-Fi联盟制造商的商标做为产品的品牌认证,是一个可以创建于IEEE 802.11标准的可以将 ...
第二届黄河警校挑战赛pwn
pwn1
read读7字节,控制一下寄存器和指令再次调用read系统调用,再读ORW的shellcode。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748from pwn import *from pwn import u64,u32,p64,p32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux", "splitw", "-h"]debug = 0if debug: p = process('./pwn') elf = ELF ...
2024高校运维管理赛二进制部分
pwn-login
登陆功能,随便输入一定长度的字符串fuzz一下,然后会发送core数据,接受保存到本地可执行文件后。
后门函数和栈溢出,直接打就行了
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162from pwn import *from pwn import u64,u32,p64,p32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux", "splitw", "-h"]debug = 0if d ...