文章目录
前言
目前CTF竞赛中,以堆为背景的pwn题已逐步成为了pwn类型题目中的主流,开始逐步接触堆题,本题涉及到在堆上布置shellcode,并利用堆指针使程序执行流得到控制。
思路分析
0x00.检查保护机制
Canary found:不能用溢出的方式控制程序执行
NX disabled:堆栈上数据可执行
PIE enabled:地址随机化开启
0x01.查看程序功能
一个简单的菜单题,add 和 del可以用,show和edit功能不可用
0x02.ida查看逻辑
获得以下信息:
- 堆块最大为8字节,但是我们只能写入7字节的数据
- 堆指针的下标可以越界
0x03.利用思路
(1)通过堆指针越界,把一些GOT表表项替换成堆指针
(2)因为NX 关闭,堆栈数据可以执行,直接在堆栈上布置shellcode
(3)每个堆块可以写入7个字节的数据,3个字节留作布置jmp short xxx(jmp short占两个字节,对应的机器码是\xeb,xxx对应1字节,且jmp short xxx是相对当前位置寻址),4个字节用于布置shellcode。
(4)要把shellcode分开布置在多个堆块上面。
jmp short xxx 中,xxx=目标地址-当前地址-2
利用过程
0x00.选一段shellcode布置在堆上
mov rdi, xxx //xxx=&("/bin/sh")
xor rsi,rsi //rsi=0,实际可以是mov rsi, 0 但是mov这个命令太长了。下同。占2字节
mov rax, 0x3b //rax=0x3b 占4字节
xor rdx,rdx //rdx=0 占2字节
syscall //就是syscall调用execve("/bin/sh",0,0)
jmp short 占2个字节
jmp short xxx占3个字节
0x01.计算jmp short指令要跳多少字节
从chunk0跳到chunk1,
目标地址-当前地址=8+8+8+1+2