hitcontraining_bamboobox
hitcontraining-bamboobox检查防护措施本地调试
堆菜单布局,且程序创建了一个chunk记为note ,fd指针存放hellomessage bk指针存放的时goodbyemessage
IDA静态分析add()
正常的add功能,输入size和name
edit()
编辑的时候会给一次重新输入size的机会,可以比创建时的size大,造成堆溢出
free()
释放chunk,指针置0,不存在uaf
show()
打印chunk内存放的内容
大致思路我们发现程序开始时会调用hellomessage这个函数,程序退出的时候choice 5 时会调用 note的bk位置指向的函数,如果我们把这个位置修改成magic函数的地址,那么choice 5时就读出了flag
方法1:House Of Force一个堆 漏洞想要通过 House Of Force 方法进行利用,需要以下条件:
12能够以溢出等方式控制到 top chunk 的 size 域能够自由地控制堆分配尺寸的大小
但是buu的flag放在根目录下所以这个方法只能打通本地,远程是打不通的
这里有个公式:
1 ...
wdb_2018_2nd_easyfmt
wdb_2018_2nd_easyfmt检查防护
本地调试
把我们输入内容的打印出来
IDA静态分析
很明了,格式化字符串漏洞,先找一下偏移
偏移为6
大致思路格式化字符串漏洞泄露printf的got表地址,得到libc基地址,再将printf_got修改为system的地址再发送’/bin/sh’就相当于执行了 system(‘/bin/sh’)
exp1234567891011121314151617181920212223242526from pwn import*context(os='linux', arch='i386', log_level='debug')#io = process('./wdb_2018_2nd_easyfmt')io= remote("node4.buuoj.cn",26972)elf =ELF('./wdb_2018_2nd_easyfmt')libc = ELF('libc-2.23_32.so')prin ...
npuctf_2020_easyheap
npuctf_2020_easyheap检查防护措施
本地调试
堆菜单这里就不放图了 主要看一下create部分 ,我们创建了三个chunk,2个大小为24的chunk和一个大小为56的chunk,gdb调试发现程序创建了6个chunk,多创建了3个chunk,这三个chunk的fd指针位置保存chunk的大小,bk指针位置指向chunk的data域
IDA静态分析create()
edit()
编辑功能存在off-by-one漏洞,那么我们可以多写一字节去覆盖下一个chunk的size构造堆重叠
show()打印程序为我们创建的chunk的bk指针指向的地址的内容,也就是我们创建的chunk地址,但是如果我们把这个地址修改成free的got表地址,我们就可以泄露libc了
free()
先释放我们创建的chunk再释放开始创建的0x10的chunk
指针赋值为0,不存在uaf
大致思路利用off-by-one覆盖下一个chunk的size构造堆重叠,再修改bk指针处的地址为free的got表地址,show打印出来泄露libc,再修改free@got为system地址,在chunk的内 ...
BUUCTF-ciscn_2019_es_7
ciscn_2019_es_71.首先查看防护措施
还是很友好的
2.本地调试查看大致情况
我们输入了aaaa 发现被打印了出来然后程序中止
3.IDA静态分析
把我们输入的内容打印出来
这里的两个gadget分别对应 sigreturn系统调用号15 和 execve的系统调用号 59
这里也是有两种解法,SROP和ret2csu
方法1:SROP1.系统调用指的是用户空间的程序向操作系统内核请求需要更高权限的服务
32位与64位 系统调用的区别:
传参方式不同
系统调用号 不同
调用方式 不同
32位:
传参方式:首先将系统调用号 传入 eax,然后将参数 从左到右 依次存入 ebx,ecx,edx寄存器中,返回值存在eax寄存器
调用号:sys_read 的调用号 为 3 sys_write 的调用号 为 4
调用方式: 使用 int 80h 中断进行系统调用
64位:
传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右 依次存入 rdi,rsi,rdx寄存器中,返回值存在rax寄存器
调用号:sys_read 的调用号 为 0 sys_write 的调 ...
roarctf_2019_easy_pwn
roarctf_2019_easy_pwn1.首先查看防护措施
好家伙直接拉满 (原地去世)
2.本地调试
常规的菜单布局
3.IDA静态分析
choice 1 : create()
chunk的size最大为4096,unk_202040+4*i = 1 表示chunk已经创建 unk_202044 + 4 *i 存放的chunk的大小 qword_202048[2 * i]存放chunk的地址
写出自动化交互函数
12345def create(size): r.recvuntil('choice: ') r.sendline('1') r.recvuntil('size:') r.sendline(str(size))
choice 2 : edit ()
最后return 是将v4字节大小的内容写入 qword_202048[ 2 * (int) v3 ] 对应的chunk地址
看一下决定v4的值的sub_E26函数
如果edit时输入的size大小比一开始申请的大小多10, ...
BUUCTF-pwnable_hacknote
pwnable_hacknote1:首先检查防护措施
2:本地调试查看大致情况
首先创建了两个chunk大小分别为0x10和0x18 ,gdb调试发现程序创建了4个chunk,除了我们创建的两个chunk外还有两个size = 0x10的chunk 这两个chunk的fd指针指向了同一个地址:0x804862b 两个chunk的bk指针分别指向我们创建的chunk的data域
3.IDA静态分析
choice 1 : add()
choice 2 : delete()
先释放了content块,再释放了note块,没有将指针置0,存在uaf漏洞
choice 3 : print()
大致情况了解完毕,大致思路我们可以先创建两个chunk释放后再申请一个大小为0x8的chunk这样会分配给我们note块,修改note块的bk指向free@got地址 利用uaf打印free@got地址泄露libc 执行system(‘/bin/sh’)获取shell
1234567891011121314151617181920212223242526272829303132333435363 ...

