Shortest_path
这题的非预期有点严重了
1 | void *sub_400946() |
程序开始我们可以看到将flag读到了全局变量s中,再结合该题的功能应该是要利用堆块申请到bss段读取flag,但是,gdb search 一下会发现
1 | pwndbg> search "flag{this_a_fack_flag}" |
堆上也有flag,再看一下top_chunk top: 0x608000 (size : 0x21000)
,所以直接控制好大小申请到flag的位置读flag就行了
exp:
1 | #coding:utf-8 |
lgd
1 | ➜ lgd seccomp-tools dump ./pwn |
可以看到程序禁用了system函数,而且保护基本全开,got表不可改
拖进IDA看进来很复杂,功能名字也看不懂是干嘛,但是瞎测一遍就知道
1 | 1. fater -----add |
理奇葩的是add
后面的输入并没有向申请出来的堆写入,而是写到了bss段,然后经过后面一通操作,使得最后edit可输入的长度就是往0x603060
这个地址写入的字符长度,别问我为什么知道,问就是黑盒。所以这里就存在堆溢出,因为这个read可以输入0x200,而size可以小于0x200。
1 | buf[i] = (char *)malloc(v13); |
接下来就是常规做法,利用堆溢出来泄漏地址,但是接下来因为system被禁了,onegadget也用不了
做法:
- 1、unsorted bin attack free_hook上方打出size
- 2、申请出free_hook 修改 free_hook为setcontext+53
- 3、SROP调用mprotect 修改bss段为可执行段
- 4、写shellcode调用orw读取flag
同样题型的还是UNCTF的orwheap,巅峰极客的pwn,至于为什么是setcontext+53
这个位置,因为这个位置可以控制绝大部分的寄存器, https://n0va-scy.github.io/2019/10/31/setcontext/
exp:
1 | #coding:utf-8 |
easyheap
首先看一下保护,没开PIE,got表可改。
1 | Arch: amd64-64-little |
漏洞点:
1 | int add() |
本题唯一的漏洞点,结合没开PIE,got 表可以的情况,这是致命的
只需要构造出指向指针的堆块,接下来就是任意地址写了
1 | add(0x400, "0") # fake |
接下来就是先修改free@got为put@plt泄露地址,再修改free@got为system 执行system('/bin/sh')
exp:
1 | #coding:utf-8 |
woodenbox
checksec,got表可改,(然并卵)
1 | Arch: amd64-64-little |
该题的漏洞主要是在remove函数中,这个for
1 | for ( i = 0; i <= 10; ++i ) |
当chunk列表满了的时候,再去free前面的堆块,这个神仙操作就会造成两个一样的chunk存在从而UAF
申请满12个chunk
满12个后free掉0号chunk,可以看到现在10,11号chunk指向同一个,就可以自由得uaf了,光有uaf还不够,change函数中对于输入的size没有检查,所以存在堆溢出
有这两点后就好办事了,先free(10)(0x70)修改其size为0x90(unsortedbin 范围),再free一次这时候fastbin上就有了main_arean+88`
0x70: 0x56372f115310 —▸ 0x7ff16d603b78 (main_arena+88)修改低两们为'\xdd\x25'(关闭aslr情况下),申请到
_IO_2_1_stdout_上方,修改flag为
0xfbad1800`来leak libc
之后修改malloc_hook为onegadget
exp:
1 | #coding:utf-8 |
bjut
checkseck,got表可改
1 | Arch: amd64-64-little |
漏洞点:下标溢出,在-1879的位置是指向got表的,所以通过下标溢出操作got表
exp:
1 | #coding:utf-8 |
kernoob && babyhacker
两道白给的内核题,cpio文件解压后搜一下flag就知道了