先看一个代码:

#include <stdio.h>
#include <stdlib.h>// 下面的dummy_libc_part1和dummy_libc_part2假设是GLIBC库里的任意两段函数
void dummy_libc_part1()
{// ... 这里可能会有别的指令__asm("mov 0(%rsp), %rdi");__asm("popq %r13");__asm("call *%r14");__asm("ret");// ... 这里可能会有别的指令
}void dummy_libc_part2()
{// ... 这里可能会有别的指令__asm("popq %r14");__asm("ret");// ... 这里可能会有别的指令
}int main(int argc, char **argv)
{__asm("pushq $0x400545");__asm("pushq $0x62");__asm("pushq $0x400521");__asm("pushq $0x400400");__asm("pushq $0x40052f");__asm("ret");printf(".");
}

猜猜会是什么结果?不要试图去编译运行,它在你的机器上不一定和我们的机器上表现一致。

我们假设dummy_libc_part1/dummy_libc_part2均是已经存在的序列,类似GLIBC中那样的,那么利用这些指令序列,不需要写任何指令,只需要在stack上堆砌数据,就可以实现程序逻辑的任意跳转。这就是ROP!利用现成的ret指令,精心布置stack上的内容,实现代码注入。

在一个程序的地址空间中,我们最容易touch的地方,也就是stack了,如此一来,ROP的一个首要问题就是如何巧妙在stack布置数据。

GLIBC是个指令序列的宝库,在里面你可以找到几乎任何可以利用的序列。但问题就在于你如何把一些零散的序列拼接成基于push/call和return/pop的逻辑,这并不是一件容易的事,就好像李白的诗中的每一个字都在字典中,但给你一本字典你却写不出李白级别的诗。

还是看下本文最初代码中stack的堆砌逻辑吧:

在ROP实践中,肯定不会像上述代码一样采用push的方式进行stack构建,而是采用缓冲区溢出的方式。拥有缓冲区溢出漏洞的最臭名昭著的比方说字符串函数。

不过在x86_64体系结构中,字符串函数终于被洗白了,因为进程地址空间的高16bit强制为0,这意味着使用见0截断的字符串函数来进行溢出时,最多只能覆盖一个地址。类似下面的stack frame,用字符串函数是万万不能构建的:

0x00007fffffffe498
0x00007fffffffe3b0
0x00007fffffffdcb8
0x00007ffff7aa39aa

因此,ROP的编写是极具技巧性的手艺,你的任务就是在GLIBC或者被注入进程所link的LIB中寻找可以利用的指令序列。原理只是让你理解字词句段篇章,而真正的断章取义,则是一种艺术。

如今的系统均自带了ASLR(Address space layout randomization)保护,因此,即便你成功hack了一个程序,hack代码也是不可重用,你不得不每次做一遍相同的艺术性的工作,当这种工作不断重复后,它也就不再是一种艺术了,实施者也随即退化成了产线工人。

而不是经理。


浙江温州皮鞋湿,下雨进水不会胖。

ROP(Return Oriented Programming)原理解析相关推荐

  1. Blind Return Oriented Programming (BROP) Attack - 攻击原理

    0x00 写在前面 第一次在WooYun发文章,不知道是否符合众客官口味,望轻拍. 这篇文章翻译至我的这篇博客,主要介绍了一种叫做BROP的攻击,该文章主要介绍原理部分,对该攻击的重现可以参看我的另外 ...

  2. AOP—JVM SandBox—底层原理解析

    原文作者:陆晨 原文地址:JVM SandBox 的技术原理与应用分析 目录 一.前言 二.JVM SandBox 简介 2.1 AOP 2.2 JVM SandBox 三.JVM 核心技术 3.1 ...

  3. AOP原理解析及Castle、Autofac、Unity框架使用

    转自:https://www.cnblogs.com/neverc/p/5241466.html AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP), ...

  4. Java OOP(Object Oriented Programming)个人理解及总结

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 其三大特征:封装,继承,多态: 封装:解决数据的安全问题. 继承:解决代码的重用问题. 多态:解决程序 ...

  5. Tomcat 架构原理解析到架构设计借鉴

    ‍ 点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这 ...

  6. 秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  7. Android之Butterknife原理解析

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 Butterknife是一个专注于Android系统的View注入框架, ...

  8. Web APi之过滤器执行过程原理解析【二】(十一)

    前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...

  9. Android 插件化原理解析——Activity生命周期管理

    之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...

最新文章

  1. 回顾与展望:大热的AutoML究竟是什么? | 技术头条
  2. 1万粉的小红书kol报价_小红书母婴博主资源怎么找?小红书母婴种草软文撰写技巧分享!...
  3. Java网络编程之TCP、UDP
  4. gddr6速率_GDDR6 显存两年后问世:比 GDDR5X 更快,速率可达 16Gbps
  5. jMeter Thread group 对应的 constant timer
  6. 一文告诉你 Java RMI 和 RPC 的区别
  7. hadoop fs 基本命令
  8. 虚拟机python环境搭载_windows之自动化在虚拟机部署操作系统并自带python环境
  9. Sublime 格式化代码 快捷键以及插件使用
  10. iOS 评论APP撰写评论
  11. Android趣味课程:九宫格拼图游戏
  12. eclipse配置折叠/展开代码设置
  13. uniapp APP 接入萤石云
  14. html5中加下划线,为超链接添加下划线
  15. 如何快速实现人脸识别通道?一文了解具体技巧
  16. 51单片机学习笔记——DA转换
  17. C语言执行时进行窗口隐藏
  18. 2000-2020年地级市进出口总额数据
  19. 程序中unsigned char 类型的意义
  20. 集成学习——bagging原理及分析

热门文章

  1. U8 EAI实现XML的生成
  2. CTF MISC在我眼里各种奇奇怪怪的题学习思路总结(持续更新)
  3. 【Matlab 控制】拉氏变换和Z变换
  4. 单体测试与结合测试区别
  5. 计算机应用的高级职称,职称计算机应用能力要求相关政策规定
  6. NB-IoT和LTE远程通讯方案选择
  7. 全国物流信息网发布台风的来临
  8. 二叉树的顺序结构及实现
  9. Vue+nodejs+express天天生鲜超市购物商城平台
  10. Python爬虫——去哪儿网评论