Pwn-浅谈orw利用
沙箱沙箱保护是对程序加入一些保护,最常见的是禁用一些系统调用,如execve,使得我们不能通过系统调用execve或system等获取到远程终端权限,因此只能通过ROP的方式调用open, read, write的来读取并打印flag 内容
123fd = open('/flag','r')read(fd,buf,len)write(1,buf,len)
开启沙盒的两种方式在ctf的pwn题中一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。
prctl函数调用如:
1return prctl(22, 2LL, &v1);
123456789101112131415// 函数原型#include <sys/prctl.h>int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);// option选项有很多,剩下的参数也由opt ...
PWN-堆基础之House of Orange
House of Orange1.IO_FILE在看House of Orange的例子之前,我们首先了解一个Linux中的利用机制_IO_FILE
可以使用ptype /o struct _IO_FILE查看这个结构的定义,在pwndbg中可以直接写为dt FILE
_IO_FILE这个结构体中有一个_chain可以看到它的类型是一个struct _IO_FILE *,也就是说是一个指向其他_IO_FILE结构体的指针;在使用fopen之类的函数打开一个文件之后,实际上系统会在堆上创建一个这样的_IO_FILE结构体,并将其加入到一个单链表中,单链表的头部为_IO_list_all,这个单链表可以理解为是一个专门存储_IO_FILE的fastbin。另外vtable为虚函数表指针,实际上是为了与C++的streambuf类兼容才会出现的,但是这里兼容性上的问题,让GLIBC的file stream有可能存在虚函数表劫持的漏洞
另一方面,我们知道Linux的文件系统中一切皆为文件
每一个进程创建时都会有三个标准I/O File Stream:
stdin
stdout
s ...
PWN-堆基础之Unsorted bin
Unsorted bin1.Unsorted bin leak简介
通过unsorted bin的partial unlink,泄露main_arena地址信息,通过计算在libc中的偏移进而获取libc基地址。
条件
1.存在UAF漏洞 或 其它可以修改unsorted bin中chunk的bk指针的漏洞。
2.glibc <= 2.28(2.29引入了UsortedBin Attack的缓解机制)。
利用
前面unsorted bin的基础知识中,我们了解到unsotred bin中的chunk会被分类到small bin和large bin
中。
这些chunk在被分类时,需要进行partial unlink操作。相比于之前提到的unlink,这里的断开连接更简
单:
victim的fd指针总是指向unsorted bin的头结点,因此可以被忽略。
victim->bk.fd = unsorted_bin_head
unsorted_bin_head.bk = victim.bk
首先,构造如下chunk:
12345c ...
PWN-堆基础之Safe Unlink
Safe Unlink简介
Safe Unlink增加了两个检测机制。
首先,检测大小是否一致,即检查next_chunk的prev_size和当前chunk的size域是否相等。
然后,检测双向链表完整性,即检查chunk.fd -> bk == chunk、chunk.bk -> fd == chunk。
条件
可以泄露保存chunk指针的数组地址。
存在堆溢出漏洞可以修改next_chunk的size域 或 存在UAF漏洞。
可以泄露libc地址。
利用
为方便描述,下文称chunk指针数组 = m_array。
在当前chunk数据段伪造一个fake_chunk,使得fake_chunk的fd指向&m_array - 0x18,bk指向
&m_array - 0x10。(绕过双向链表检测)
将next_chunk的prev_size修改为当前chunk大小,然后将size域中prev_inuse置0。(绕过大小
检查,prev_size用于程序定位到fake_chunk) ...
PWN-堆基础之Unsafe Unlink
Unsafe Unlink1.unsorted bin首先介绍unsorted bin,unsortedbin 是一个双向链表的结构,因此a中这两个指针分别是bk和fd,分别指向前一个和后一个chunk;free时,若该chunk没有紧邻top chunk,则不会与top chunk进行合并,它首先被链入unsorted bin中,被首次分配时,unsorted bin会扫描各chunk并根据大小链入不同bin中。
2.Unsafe Unlink简介
Unsafe Unlink指的是早期unlink,没有大小检查、双向链表完整性检查,并且没有NX保护
当进行unlink时,会执行如下操作:
12this->fd->bk = this->bk;this->bk->fd = this->fd;
因此,如果我们能够伪造fd和bk的指向,就可以实现任意地址写入,而要进行unlink操作我们需要修改next_chunk的pre_inuse为0,这是free掉next_chunk会使这两个chunk进行合并。
条件
未开启NX保护。
程序存在堆溢出漏洞 ...
PWN-堆基础之FastBin_Attack
FastBin_AttackFastBin_dup1.FastBinfastbin采用LIFO的单链表方式管理空闲chunk,fastbin不会修改空闲chunk的prev_inuse标志位,也不会进行堆块合并。
fastbin的大小范围为0x20-0x80,共7个单链表数组(只有fd指针,即单向链表)。每个链表数组依次递增0x10大小。相同大小的chunk会被分配到同一个链表数组中。
当某个堆块被释放后,它的fd指针会指向下一个空闲chunk,arena会保存每个链表头部chunk的地址。
注:free释放堆块后,会将堆块链入到main_arena对应大小的bin中,可以用dq &main_arena 20查看main_arean中存放的各个bin的头结点。从上到下分别对应main_arean布局中的不同大小的chunk块。
Double Free简介
Double Free即两次释放同一个chunk,可以伪造该chunk的fd指针,在fastbin链表中增加一个fake_chunk地址,实现任意地址写。
由于libc中加入了double free缓解机制,即会检查当 ...
PWN-堆基础之House of Force
House of Force攻击1.top_chunk:在学校House of force之前,先来学习top_chunk:
top chunk是一块很大的chunk块,不属于任何Bin,在arena中属于最高地址。每次程序初始化后会调用sbrk函数创建一块大小为(0x21000) 的区域作为top_chunk,每次malloc时,首先从各种bins种寻找,没有其它空闲块时,top_chunk就会被用于分配。
堆内布局如下:
每次malloc时,top_chunk指针向高地址移动(原理堆基地址),同时size变小(但如果我们更改size字段,top_chunk指针不动)
这里说明一下malloc:首次的malloc从top_chunk处申请,返回申请的指针指向申请的data字段,并不指向pre_size控制字段。
申请规则如下:malloc申请到的chunk大小(特指我想要的数据长度大小)会比实际申请的大小多0x10。(因为多0x10的控制字段,32位同理会多0x8)
12345678#include <stdlib.c> int mian(){ mal ...
Crypto-常用工具
密码学常用工具引自crypto常用工具 | Lazzaro (lazzzaro.github.io)
1.gmpy212345678910from gmpy2 import *mpz(n) #初始化一个大整数mpfr(x) # 初始化一个高精度浮点数xd = invert(e,n) # 求逆元,de = 1 mod nc = powmod(m,e,n) # 幂取模,结果是 c = m^e mod nis_prime(n) #素性检测gcd(a,b) #欧几里得算法,最大公约数gcdext(a,b) #扩展欧几里得算法iroot(x,n) #x开n次根
2.sympy12345678from sympy import *prime(n) #第n个素数isprime(n) #素性检测primepi(n) #小于n的素数的总数nextprime(n) #下一个素数prevprime(n) #上一个素数nthroot_mod(c,e,p,all_roots=True) #有限域开方
3.Sage123456R.<X> = PolynomialR ...
Crypto-多项式环链表求解
多项式环上求解问题:引自 Lazzaro @ https://lazzzaro.github.io
1.对于一些模n运算的求解,我们可以将问题转化为模n多项式环上求解答问题1234567R.<X> = PolynomialRing(Zmod(n))#Zmod(n):指定模,定义界限为n的环;Z表示整数;指定模是划定这个环的界限,就是有效的数字只有从0到n,其他的都通过与n取模来保证在0~n这个范围内;Zmod代表这是一个整数域中的n模环#ZZ:整数环;QQ:有理数环;RR:实数环;CC:复数环#R:只是一个指针,指向用polynomialring指定的那个环(可以使用任意字符)#PolynomialRing:这个就是说建立多项式环#.<X>:指定一个变量的意思(可以用任意字符)
现在,观察如下方程式,
12n = p * qy ** 2 = x ** 3 + a * x + b mod(n)
其中 y,a,b已知,根据常规方程我们是无法求出x的解的,因为对于第二个方程,我们未知的变量有x和n,单个方程无法解决二元变量求解问题,因此我们需要将改方程转换到模n多 ...
Crypto-格初识
一、格的概述
格是离散的Rn加子群。每个格都是一些线性无关的向量产生的集合,称之为基。
二、格基规约任意格都有无数个基,LLL 算法就是在格上找到一组基:其长度尽可能最小,并于基中其他矢量尽可能正交。即对应方程组中找到一组满足等式的最优解。
规约算法过程太过复杂,此处省略。。。
三、格基规约简单使用1.对二元单方程的求解题目:
12t = 44,P,Q已知,求解p,qt=(p*P-58*P+q)%Q
格的构造:
LLL规约:
12345678M = Matrix(ZZ, [[1, P], [0, Q]]) //在ZZ整数环上定义一个二维矩阵[[1,P],[0,Q]]v = M.LLL()[0] //LLL规约p, q = -vp = p + 58q = -q + 44
2.求解矩阵相乘运算中某一未知矩阵题目描述
题目基于矩阵乘法AM=C,其中这三个均为n×n方阵,M为消息矩阵且较小。
给出矩阵C,并且将A中的随机n个元素毁坏,得到Ac并给出。
试求M。
题目分析:
M为消息矩阵且较小,这意味着我们或许可以 ...