2019 0CTF/TCTF Quals 部分PWN WriteUp
babyaegis首先我们看一下程序开启的防护机制
程序开启了ASAN,UBSAN保护。
ASANasan(AddressSanitizer)是google开源的一个用于进行内存检测的工具,可以检测常见的heap and stack BufferOverflow,global buffer overflow, UAF等
asan主要由两个部分构成,插桩和动态运行库,其中插桩主要是针对的是llvm编译器级别对访问内存的操作(store,load和alloca等),而动态运行库则主要提供一些比较复杂的操作,例如position/unposion(用于进行内存保护)和影子内存,同时hook free,malloc等函数。启用了asan保护的程序不同size大小的chunk是在不同内存区域进行分配的,并且free掉之后的内存在一段时间内并不会被启用。chunk也与一般的chunk不相同,其头部0x10字节大小的ChunkHeader用来存储chunk的一些信息。
12345678910111213141516171819struct ChunkHeader { // 1-st ...
高校战疫网络安全分享赛 WP
Babyhacker2分析首先我们看一下startvm.sh
有时间限制,并且开启了kalsr,smep,smap的保护。即内核不能访问用户空间的数据和代码,这个保护可以通过修改cr4寄存器来关闭。我们看一下虚拟机本身
1cpio -idmv < initramfs.cpio
首先是加载了babyhacker.ko的驱动,这里驱动开启了canary和NX保护。接着将dmesg_restrict/kptr_restrict置为0意味着我们可以通过cat kallsyms查看commit_creds/prepare_kernel_cred两个函数的地址。通过commit_creds(prepare_kernel_cred(0))调用来实现提权。
漏洞出现在0x30000的操作处
我们传入的rdx是一个signedint,因此我们可以通过输入负数来实现判断的绕过
绕过判断之后就可以将di即后两个字节赋值给buffersize。由于读取和写入的操作是通过buffersize来控制的,因此我们可以实现栈内容的泄露和栈溢出覆盖返回地址ROP。
利用
修改buffersize ...
docker pwn 环境搭建
1sudo docker run -it -v /home/pwn/Desktop/pwn_ques:/root/work -v /home/pwn/Desktop/glibc:/root/glibc -p 9994:8888 --privileged --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" --name pwn18_10 pwn:18.10
ubuntu 18.04 pwn docker dockerfile目前是18.04的Dockerfile
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 ...
GeekPwn 2020 云靶场挑战赛热身赛 WP
题目链接
BabyPwn分析首先我们看一下程序,程序提供了三种操作add, throw_out,show,操作的结构是member,describe是依据用户输入的大小所分配的堆空间,但是输入的大小最大是0x40,即堆块最大为0x50
漏洞函数位于add中读取字符串的函数
注意到length的类型为int,因此存在堆溢出漏洞。
利用有两种利用的方式
方式1整体思路为通过unsorted bin泄露libc地址,FSOP进行getshell
释放两个相同大小的chunk,申请chunk的时候将size设置为1,这样就不会读取内容,从而泄露出堆地址
通过堆溢出伪造chunk,大小为连续申请的几个chunk和,使其释放时进入unsorted bin中,从而获取libc基址
堆溢出覆写unsorted bin的fd,bk指针,伪造IO_FILE,采用FSOP进行getshell
首先泄露heap的地址
12345678910111213141516171819add_member("12112", 0x10, "0")add_member(&qu ...
LinuxX86程序启动-main函数执行
调用过程分析首先我们编一个简单的main函数,函数主体为空
123int main(){ }
编译完成之后,我们需要知道程序第一个调用的函数是什么,查看ELF文件的头部objdump -f mainAna
可以看到可执行文件的起始地址是0x80482e0,也就是函数第一个调用的是0x80482e0处存储的函数,那么这个可执行文件的起始地址是如何得到的呢,我们知道每一个elf文件都具有一个头部,头部格式的定义如下
1234567891011121314151617typedef struct{ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ Elf32_Half e_type; /* Object file type */ Elf32_Half e_machine; /* Architecture */ Elf32_Word e_version; /* Object file version */ Elf32_Addr e_ent ...
windbg教程
安装有两种方式可以进行安装,一种是直接在微软的应用商店中搜索windbg preview进行安装下载,另一种是通过安装win10 SDK中的debugging tools进行安装。我是采用第二种方式进行安装的,因为第一种方式下载安装的windbg preview无法运行。
下载下来之后运行选择Debugging Tools for Windows下载完成之后到一开始选择的目录下面寻找安装文件,安装即可。
安装symbols
将windbg的安装目录加入到环境变量中方便程序寻找SYMSRV.DLL, SYMSTORE.EXE文件
新建环境变量_NT_SYMBOL_PATH,其值设置为SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols,或者查看windbg的项目地址获取服务器的地址
前面的设置的文件夹是用来存储下载的符号文件的,也可以将值设置为cache*c:\mysymbol;srv*http://msdl.microsoft.com/download/symbols
attach一个进程,即可以在相应的文件夹下面 ...
glibc2.23中的malloc和free源码分析
管理结构malloc_chunkchunk的基本结构
12345678910111213141516171819202122232425262728293031323334353637383940414243struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nextsize; /* double links -- ...