asis2016_b00ks(根据报错信息确定mmap拓展偏移)
asis2016_b00ks(根据报错信息确定mmap拓展偏移)这个应该是大部分人学off-by-one的第一个例题,当时笔者也是只在本地去测试,最近重温又发现了一些有趣的东西
这里有个off-by-null,可以看到14行 如果i = a2就break,再让*a1 = 0,比如我们的size为10,正常我们被允许输入10个字节的数据,这里的i是从0开始的,所以是0-10,也就是11字节,多出的一字节被置0
具体这里就不展开分析了大致讲一下利用过程,如果想看更详细的,网上一堆师傅分析的都很详细
大部分做法是申请一个大块,topchunk不够用,使用mmap分配,我们去泄露这个分配地址去获得libc基址,但是这里有个问题就是不同环境下,这个偏移是不同的
首先会让输入作者名字,这个内容存放在0x555555602040位置,当然由于开了PIE,这个不是固定的,根据程序加载基址来确定,分配大小是0x20,紧跟着的是chunk的管理块,如果我们把0x20的空间写满就能打印出第一个管理堆块的地址
123456789io.sendlineafter(b'Enter author nam ...
house of orange
house of orange(没有free情况下获得一个unsortedbin)之前就已经了解了house of orange但是没有写博客记录,这几天正好把buu上前几页当时没写的写了一下,其中就有著名的house of orange
实现效果:123house of orange可以实现程序无free的情况下,放入一个unsortedbin条件:能控制topchunk->size,能分配的chunk的大小也要大于伪造后的topchunk->size
单一效果薄弱但是如果配合unsortedbin&FSOP等攻击方法就能实现很不错的效果,如此巧妙的利用链早在2016年就被hitcon战队的orange师傅发现实在是太强了,并且据我了解在2017年orange大佬又在 2017年的 hitcon 出了一个 0day 的 php phar:// 反序列化给整个安全界开启了新世界的大门(Orz)
例题:houseoforange_hitcon_2016
保护开满,且根据功能来看是没有free的,进IDA看一下
漏洞在upgrade处,会重新根据输入的size来写 ...
非栈上格式化字符串漏洞利用
非栈上格式化字符串漏洞利用通常格式化字符串是写在栈上,首先去测偏移,然后改got表,但是有时候也会有我们输入的格式化字符串在堆上,在bss段上的情况,这样我们无法用老一套测偏移写地址直接改got,我们需要借助ebp链,有时还要借助argc链
例题1:xman_2019_format
程序存在格式化字符串漏洞,且存在后门0x080485ab
但是我们输入的在堆上,调试看一下
可以看到ebp链,如果我们修改偏移为10处的0xffffd078 -> 0xffffd05c ,那么在偏移18处就是修改0xffffd05c了,也就是可以修改返回地址了
输入payload调试看一下’%92c%10$hhn|%34219c%18$hn’这里要加上”|”分隔开,不然改的是原先偏移18处的值,而不是我们修改的0xffffd05c程序是给了两次printf,我们加上|依次修改
首先是%92c%10$hhn修改了ebp链,然后执行%34219c%18$hn
这时返回地址已经被修改成了后门地址
但是如果打远程的话,是需要爆破低一字节的
exp:123456789101112131415161 ...
tcache_stashing_unlink_attack
tcache_stashing_unlink_attacktcache stashing unlink attack实现的效果和unsortedbin attack有点相似,可以向任意地址写一个较大的数
如果构造合理,还可以实现任意地址分配chunk
malloc.c : line 3635
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 if (in_smallbin_range (nb)) { idx = smallbin_index (nb); bin = bin_at (av, idx); if ((victim = last (bin)) != bin) { bck = victim->bk; if (__glibc_unlikely (bck->fd != victim)) malloc_printerr ("malloc ...
劫持fini_array
劫持fini_array
先贴一张程序的启动流程图
main 函数不是程序起点 text 段起点是_start函数 。_start 函数调用__libc_start_main 完成启动和退出工作
程序在加载的时候,会依次调用init.array数组中的每一个函数指针,在结束的时候,依次调用fini.array中的每一个函数指针
例题:ciscn_2019_sw_1checksec
no relro可以修改fini_array
有个格式化字符串漏洞,但是只有一次机会
还有个system
一次格式化字符串利用不够,所以我们要改finiarry为main,printf为system,这样程序再循环main,我们输入/bin/sh就拿到shell了
fini_arrayfiniarry的位置获取方式:
shift+f7打开IDA的Segments窗口
或者elf.sym[‘__init_array_end’]都可
exp:1234567891011121314151617181920212223242526272829303132# -*- coding: utf-8 -*-from p ...
西湖论剑_2018_小陈的笔记本加强版
libc2.27下off-by-null的利用
在edit功能里有个off-by-null,libc版本是2.27
2.27下off-by-null基本是配合利用unlink,但是这里的我们能控制的chunk中间夹了一个管理堆块
所以首先我们需要先布置堆风水让我们控制的chunk挨在一块
1234567891011add('0',0x10,'0')add('1',0x10,'1')free(0)add('0',0x420,'0') # 0 add('2',0x28,'2') # 2free(1) add('1',0x4f0,'1') # 1add('3', 0x10, '3') # 3free(0)
现在去编辑chunk2去修改chunk1的presize,且覆盖一字节0,然后去释放1触发unlink,申请0x420的chunk,此时管 ...
inctf2018_wARMup
inctf2018_wARMup
有栈溢出,但是溢出空间不够,要做栈迁移
arm架构的bss段是可以执行的
读入地址由r3重置,我们控制r3就控制了输入的位置
这条gadget就很合适,既控制了r3,又控制了pc ,再覆盖sp和r11的值即可
exp:
123456789101112131415161718192021222324# -*- coding: utf-8 -*-from pwn import *context(os = 'linux', arch = 'arm', log_level = 'debug')io = process(["qemu-arm", "-L", "/usr/arm-linux-gnueabihf", "./wARMup"])elf = ELF('./wARMup')io.recvuntil('Welcome to bi0s CTF!')pop_r3 = 0x00010 ...
指针未初始化漏洞-ciscn_2019_ne_6
指针未初始化导致double freeciscn_2019_ne_6checksec:
漏洞点:
未初始化的指针ptr,通过构造s来达到任意地址释放,形成double free
这里free没有清空内容,我们释放一个chunk进unsortedbin,在申请回来就得到了libc地址
123456789101112add(0x420,b'a\n') #0add(0x80,b'a'*0x80) #1add(0x80,b'b'*0x80) #2 free(0)add(0x420,b'\n') #0show()libc_base = u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) - 96 - 0x10 - libc.sym['__malloc_hook']success('libc_base ----------------->'+hex(libc_base))
再泄露 ...
劫持TLS(bypass canary)
劫持TLS(bypass canary)当程序在创建线程的时候,顺便会创建一个TLS(Thread Local Storage),该TLS会存储canary的值,而TLS会保存在stack高地址的地方。所以,当我们溢出足够大的字节,就可以控制TLS结构体,进而控制canary
fs寄存器也就指向了TLS这个结构体,其偏移0x28的位置是stack_guard,里面的值就是放进栈的canary
看个例题:
starctf2018_babystack
程序的逻辑也并不复杂,创建了一个线程,线程函数内存在栈溢出,而且溢出字节可达到0x10000
我们想覆盖掉TLS里的stack_guard首先需要找到它
我这里断点断在0x400a7d的位置
我们输入a 的位置 : 0x7ffff77edf40
TLS的位置:0x7ffff77ef700
stack_guard的位置 0x7ffff77ef700+ 0x28
看一下确实这里存放着canary
接下来就可以利用栈溢出写ROP了
但是后面发现偏移不对,因为用的16.04的机子,题目的libc是18.04的,patchelf后再测:
...
house of storm
House of stormhouse of storm 是一个结合了 unsorted bin 和 largebin attack 的危害性极高的组合漏洞。其效果是可以实现任意地址申请一个堆块
12341. glibc版本小于2.292. 需要攻击者在 large_bin 和 unsorted_bin 中分别布置一个chunk 这两个chunk需要在归位之后处于同一个 largebin 的index中且 unsorted_bin 中的chunk要比 large_bin 中的大3. 需要 unsorted_bin 中的 bk指针 可控4. 需要 large_bin 中的 bk指针和bk_nextsize 指针可控
我们把 unsorted bin 里的chunk的 bk 改为 target_addr ,把 large bin 里的chunk的 bk 改为 target_addr + 8 ,把 bk_nextsize 改为 target_addr - 0x18 - 5。这样再通过一系列的过程就可以伪造出一个堆块并链入 unsorted bin 中,再申请相应大小的堆块,即可实现任意 ...



