本节将介绍基本的ROP(Return-Oriented Programming,返回导向编程的)的攻击原理、二进制程序的保护机制,并通过两个实例ret2text、ret2shellcode,为读者简介基本的ROP攻击过程。本节所使用的实例可在CTF wiki上进行下载,链接为:基本 ROP - CTF Wiki (ctf-wiki.org)
本节使用的工具包括IDA pro、gdb-peda、pwntools,已在上一篇博客中进行了介绍,详情请见:(58条消息) pwn入门(1):kali配置相关环境(pwntools+gdb+peda)_Bossfrank的博客-优快云博客
ROP攻击原理
ROP的全称为 Return-oriented programming,即返回导向编程,其主要思想是在栈缓冲区溢出的基础上,通过利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。 是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御,比如内存不可执行和代码签名等。ROP攻击执行需要满足如下两个条件:
-
程序存在溢出点(如C语言的gets等不安全的函数),并且可以控制返回地址。
-
可以找到满足条件的 gadgets 以及相应 gadgets 的地址(如系统调用相关函数system等)
简单的将,ROP攻击的思想就是:在栈溢出的基础上,努力去代码段(可执行区域)拼凑出机器指令的片段,完成要执行攻击的逻辑。
二进制程序保护机制
拿到二进制程序后,使用checksec即可查看该程序开启了哪些保护机制,包括以下几种:
RELRO
全称为Relocation Read-Only,重定位表只读。设置符号重定向表格为只读或在程序启动时就解析并绑 定所有动态符号,从而减少对 GOT 表的攻击。如果 RELRO 为“Partial RELRO”,说明对 GOT 表具有写权限。
Stack Canary
cannary单词本意是“金丝雀”,我的理解这里将该词引申为“标记位置”。函数开始执行时先在栈帧基址 (如 EBP 位置) 附近插入 cookie 信息(标记),当函数返回后验证 cookie 信息是否合法, 如果不合法就停止程序运行。攻击者在执行溢出时,在覆盖返回地址的时候往往也会覆盖 cookie 信息,导致栈保护检查失败从而阻止 shellcode 的执行。
ASLR
全程为Address Space Layout Randomization,地址空间布局随机化。通过对堆、栈、共享库等加载地址随机化,增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置。随机化影响的是程序加载的 基地址,页内偏移不会发生变化。
PIE
全称为Position Independent Executable,地址无关的可执行文件,每次加载程序时都变换 text、 data、bss 等段的加载基地址,使得

本文介绍了ROP攻击的基本原理,包括利用程序中的gadgets改变执行流程,以及需要满足的条件。讨论了二进制程序的保护机制,如RELRO、StackCanary、ASLR、PIE和NX,并通过ret2text和ret2shellcode两个实例展示了如何利用这些技术进行溢出攻击。文章还提供了利用工具如IDApro、gdb-peda和pwntools进行分析和利用的步骤。
最低0.47元/天 解锁文章
569





