HCTF 2016 fheap [2019.02.05]
程序中对在uaf,可以进行double free来造成堆块的重叠。
通过第一次堆块重叠,可以将一个chunk的释放功能的地址改为call puts
的地址,从而在delete
时调用puts
函数进行输出。第二次堆块重叠则用来伪造堆块的大小,使其释放后位于unsorted bin
且与前述含有puts
函数的堆块重叠。通过分配unsorted bin
使得可以通过puts
泄漏出libc的基地址。同样的,也可以泄漏出程序的基地址。
但这种方法存在问题:只知道libc基地址而无法知道libc的函数地址。(通过爆破libc版本说不定可以getshell)
不过.got表中存在能够伪造0x70大小chunk的空间,可能可以利用这个和第一次堆块重叠调用puts
的方法来把libc泄漏出来。(一个很大的问题就是无法向堆块中写入\x00)
也尝试过调用printf
函数来利用格式化字符串漏洞泄漏地址,但是调用时总是会遇到Segmentation Fault。
1 | from pwn import * |
看了官网wp:https://github.com/zh-explorer/hctf2016-fheap/blob/master/poc.py。
它是通过ROP来getshell,在进行delete
的时候跳转到gadget强制delete
提前返回来达到ROP的目的。利用函数中用于保存用户输入的buf来ROP。
修改后的exp如下:
1 | from pwn import * |
DEFCON QUALIFIER 2014 shitsco [2019.02.09]
对于我这种逆向渣来说理顺程序逻辑还是花了一点时间Orz。在对set
的值进行清除时,如果清除的是第二个变量且保存在.bss上的第一个变量已经被清除时(此时第二个变量的prev
值为0,第一个变量的next
值为第二个变量的地址),第一个变量的next
不会被修改,导致了UAF。只要将第二个变量所在的chunk重新获取并控制其中的内容为保存密码的地址,就能够泄漏密码获得flag。
1 | from pwn import * |
PlaidCTF 2015 Plaiddb(datastore) [2019.02.11]
在输入索引的函数中,存在着off-by-null
。利用off-by-null
进行chunk overlap,然后泄漏libc基地址、利用0x70的chunk修改__malloc_hook
的值为one_gadget。
漏洞如下:
1 | char *read_row_key() |
exp如下:
1 | from pwn import * |
HITCON CTF 2016 Quals ShellingFolder [2019.02.14]
在0x1334函数中存在信息泄露和任意地址写的漏洞,泄漏堆栈地址并将__malloc_hook
改成one_gadget
即可。
1 | from pwn import * |
Boston Key Party 2016 simple-calc-5 [2019.02.15]
保存结果时存在复制后栈溢出,可以ROP,但程序静态编译,需要ROP到mprotect
将部分内存修改为wx
属性来ret2shellcode。
1 | from pwn import * |
HITCON 2016 babyheap [2019.02.18]
NullCON 2019 shop [2019.02.21]
use after free
漏洞,通过double free
可以泄漏got表信息、获取libc。修改__malloc_hook
即可getshell。也有wp通过格式化字符串漏洞实现信息泄露。
1 | from pwn import * |
NullCON 2019 babypwn [2019.02.28]
格式化字符串和有、无符号数的比较两个漏洞。虽然能够溢出,但是程序开启了canary
保护,需要想办法规避。看了其他人的wp才知道,对于
1 | scanf("%d", ...) |
来说,如果用户输入字符-
或+
,scanf
函数不会改变相应变量的值。涨知识了。绕过canary
后就是常规的格式化字符串漏洞了。
原文:
1 | This requires knowledge of a cool scanf trick. When scanf is called like so: |