[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