[OGeek2019]babyrop

本文详细探讨了如何针对一个32位程序,其Got表不可写的情况进行漏洞利用。通过分析IDA的伪代码,发现程序中存在一个使用strncmp的敏感判断,需要绕过该判断。利用strlen函数的特性,输入特定格式的数据,控制变量v5的值以触发缓冲区溢出。接着,利用write函数泄露内存地址,进一步计算system函数地址,并最终修改返回地址为system,实现代码执行。

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

[OGeek2019]babyrop

查看程序的保护机制
在这里插入图片描述
发现是got表不可写的32位程序
拖进ida查看伪代码
在这里插入图片描述
sub_80486BB是初始化缓存区的函数
发现buf是一个随机数
在这里插入图片描述
在这里插入图片描述

发现函数中存在strncmp比较函数,其中buf为用户输入的值,&s为buf随机数,如果不相等则会退出程序,所以需要想办法绕过这个判断,所以v1的值必须为0

v1 = strlen(buf),strlen这个函数有个缺陷:遇到\x00直接截断。所以我们要输入第一位数为\x00
在这里插入图片描述
buf是一个7位数的数组,但函数中有v6 = read(0, buf, 0x20u);,从标准输入读取0x20个字节到buf,而v5恰好是buf的第8位,因此我们可以覆盖控制v5

接下来来看最后一个函数
在这里插入图片描述
其中a1即为上文中的v5,假如a1等于127则会执行第一条语句,不会溢出,当a1大于0xE7时就会存在溢出,从而覆盖返回地址

解题思路:首先通过\x00来绕过判断,覆盖v5为\xff(使得v5尽可能的大),通过wirte函数来泄露write的内存地址,然后利用libc来计算system函数地址,最后利用溢出使得返回地址为system
exp:

# -*- coding:utf-8 -*-
from pwn import *
from LibcSearcher import *

# context(os='linux', arch='amd64')

sl=lambda x:io.sendline
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值