How2heap--unsorted_bin_attack 0ctf2016--zerostorage

unsorted bin attack 对unsorted bin中的chunk->bk进行修改,接下来该chunk分配出去时,chunk->bk->fd就被赋值为unsortedbin头结点地址。 1 2 3 4 bck = victim->bk; /* remove from unsorted list */ unsorted_chunks (av)->bk = bck; bck->fd = unsorted_chunks (av); 在glibc2.28中增加了以下检查,使得此攻击失效。 1 2 if (__glibc_unlikely (bck->fd != victim)) malloc_printerr ("malloc(): corrupted unsorted chunks 3"); unsorted bin attack通常为进一步的攻击做准备,比如覆写global_max_fast。 0ctf2016 zerostorage 1 2 3 4 5 6 Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled FORTIFY: Enabled 关键数据结构 flag:标识该节点是否存在 size:记录大小 content:数据块指针 程序有以下功能 1 2 3 4 5 6 7 1. Insert 2. Update 3. Merge 4. Delete 5. View 6. List 7. Exit insert:获取数据块大小,并读入数据。数据块大小在128~4096这个范围内 update:对数据块进行大小内容进行更新 merge:将两节点合并。这里存在漏洞,输入两次相同的id,导致UAF。这个漏洞我没发现,思维还不够猥琐啊 delete:释放数据块,清空节点 总体思路 通过UAF,首先泄露libc基址,然后修改其bk指针,使用unsorted bin attack修改global_max_fast变量;fastbin bin attack覆写__free_hook为system函数地址。 ...

July 12, 2020 · hhdx

How2heap--house_of_force Bctf2016--bcloud

House of force 溢出修改topchunk的size,分配一个使size_t溢出的evil_size,使下一次分配在目标位置,进行修改。 1 2 3 4 5 6 7 8 9 /* * The evil_size is calulcated as (nb is the number of bytes requested + space for metadata): * new_top = old_top + nb * nb = new_top - old_top * req + 2sizeof(long) = new_top - old_top * req = new_top - old_top - 2sizeof(long) * req = dest - 2sizeof(long) - old_top - 2sizeof(long) * req = dest - old_top - 4*sizeof(long) */ Bctf2016 bcloud 分析 1 2 3 4 5 Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8047000) 程序一开始让输入name、org、hostname,输入字符串函数存在null byte overflow。 输入name函数中,字符串数组在栈中后部紧邻指针变量,所以strcpy会将该指针一并拷贝入0x40的空间(实际可用0x44),并且null byte覆盖topchunk的最低字节。可以泄露堆的地址 输入org、hostname函数中,存在同样问题,可覆盖的更多的字节。可以覆盖topchunk的size ...

July 7, 2020 · hhdx

How2heap--overlapping_chunks Hack.lu2015--bookstore

overlapping chunks 溢出对unsortedbin中的chunk->size进行修改,造成堆块重叠。 hack.lu2015 bookstore 1 2 3 4 5 Arch: amd64-64-little RELRO: No RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x3ff000) 程序是一个订书系统,在main函数开始处,连续分配3个0x80的空间,一个存储订单1——order1,一个存储订单2——order2,一个存储提示信息——info。有以下功能菜单 1 2 3 4 5 1: Edit order 1 2: Edit order 2 3: Delete order 1 4: Delete order 2 5: Submit Edit order 1/2:order1/order2使用fgetc读取字符串,读到\n终止,所以这里存在溢出 Delete order 1/2:free掉order1/order2。这里存在指针悬空 Submit: 分配0x140的空间(称为orderlist)将order1和order2拼接。这里存在溢出 程序末尾printf(info)存在可能的格式化字符串漏洞。 overlapping chunks && format string vulnerability...

July 5, 2020 · hhdx

How2heap--poison_null_byte Plaidctf2015--plaiddb

Poison null byte 关于堆块重叠,可以看这篇文章,图文并茂。 glibc2.26中,在unlink宏中加入了size==prev_size(next_chunk)的检查,与下一chunk所存储的pre_size进行了比对,在poison_null_byte.c中相应的添加了*(size_t*)(b+0x1f0) = 0x200,可以绕过这个检查,所以how2heap的README中对glibc的要求是<2.26应该是忘了改。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 chunk b +------> +----------+ | | +----------+ <---------+ size | 0X200 | +----------+ <---------+ b | | | | | | | | | | | | | | | | | | +----------+ <--------+ fake pre_size | 0X200 | +----------+ | | chunk c +------> +----------+ <--------+ pre_size | 0X210 | +----------+ | | | | | | 触发unlink的流程:通过null byte溢出伪造完0x200的chunk后,此时该chunk存在于unsortedbin。再次分配0x100的b1时,遍历unsortedbin,该chunk被放入到smallbin中,unsortedbin里的chunk也就这一个,遍历结束无法分配。又通过查找binmap找到0x200的smallbin,这时触发的unlink,将该chunk从smallbin中取出。 ...

July 3, 2020 · hhdx

how2heap--House_of_Spirit Hack.lu2014--oreo

House of Spirit 该攻击手法的主要是思想是,在不可控区域的前后伪造chunk信息,覆盖某指针指向chunk2mem(fake_chunk),释放该指针后再次申请,对不可控区域的进行改写。 1 2 3 4 5 6 7 8 9 10 11 +---------------+ | 可 控 区 域 | +---------------+ | | | 不 可 控 区 域 | | | | 一 般 为 某 些 | | 指 针 | +---------------+ | 可 控 区 域 | +---------------+ 伪造的chunk也通常是fastbin,因为检查容易绕过。 ...

July 1, 2020 · hhdx

How2heap--fastbin_dup_consolidate Hitcon2016--SleepyHolder

前置 Ubuntu 16.04 使用how2heap脚本编译glibc2.25,其中的4是编译线程数。脚本中git clone慢,可以替换成tsinghua mirrors,把第83行的git clone git://sourceware.org/git/glibc.git "$SRC" 替换成 git clone https://mirrors.tuna.tsinghua.edu.cn/git/glibc.git "$SRC"。 1 $ ./glibc_build.sh 2.25 -j 4 -disable-tcache 做这道题目使用了glibc2.25,patchelf --set-interpreter /path/to/ld-2.25.so /path/to/exe,patch之后再运行程序就自动使用同目录下libc-2.25.so。 ...

June 28, 2020 · hhdx

ucore os lab7笔记

同步互斥 理论 互斥、死锁、饥饿 互斥是指某一资源同时只允许一个进程对其进行访问,具有唯一性和排它性,但互斥不用限制进程对资源的访问顺序,即访问可以是无序的。 同步是指在进程间的执行必须严格按照规定的某种先后次序来运行,即访问是有序的,这种先后次序取决于要系统完成的任务需求。 17 临界区 空闲则入、忙则等待、有限等待、让权等待(可选) 实现的三种办法:禁用中断、软件方法、更高级的抽象方法 方法比较主要考虑性能:并发级别 禁用中断...

March 24, 2020 · hhdx

ucore os lab4笔记

内核线程管理 实验执行流程综述 内核线程是一种特殊的进程,内核线程与用户进程的区别有两个: 内核线程只运行在内核态而用户进程会在在用户态和内核态交替运行; 所有内核线程直接使用共同的ucore内核内存空间,不需为每个内核线程维护单独的内存空间而用户进程需要维护各自的用户内存空间。 进程的属性与特征解析...

March 17, 2020 · hhdx

二级指针与二维数组,数组指针与指针数组

昨天写一个程序的时候直接将二级指针指向二维数组,发生段错误,发现了自己的一个认识误区。 1 2 3 4 int a[5][4]; int **p; p = a; printf("%d", p[2][0]); //访问引起段错误 ...

February 5, 2019 · hhdx

CSAPP3e:Attacklab

简介 这是CSAPP这本书的第三个实验,实验所需要的材料在 CSAPP3e。 这个实验分为两部分,第一部分是代码注入实验,主要是通过Gets()函数的堆栈溢出传入指令,然后跳转到指定位置执行的方式来实现执行指定指令;第二部分是ROP实验,因为这里采用栈随机化和堆栈不可执行所以代码注入失效了。ROP利用截取已知某指令序列来创建目的指令的方法来实现的,其中在实验中可利用的指令序列限制为farm.c生成的部分,通过Gets()函数的堆栈溢出传入一系列指令地址和数据实现。 Code injection attacks Phase 1 实验目的是test()函数调用getbuf()后执行touch1()函数而不返回test(),所以这里用touch1()的地址覆盖掉test()的地址就可以。getbuf()里面分配了0x28个字节栈空间,所以这里把栈顶的0x28个字节覆盖掉,在末尾添加touch1()的地址就可以了。需要注意字节顺序。 1 2 3 4 5 6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 17 40 00 00 00 00 00 /* 0x4017c0 即为touch1()起始地址*/ ...

March 22, 2018 · hhdx