20145227鄢曼君《网络对抗》shellcode注入&Return-to-libc攻击深入

shellcode注入实践

shellcode基础知识

  • Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址。

实践过程

  • 获取shellcode的C语言代码

  • 将环境设置为:堆栈可执行、地址随机化关闭

  • 选择anything+retaddr+nops+shellcode的结构构造攻击buf。我们用\x4\x3\x2\x1覆盖到堆栈上的返回地址的位置,把它改为这段shellcode的地址

  • 在终端注入这段攻击buf。注意输入指令之后不要立即按回车,在后面的调试过程中需要继续运行的时候再回车

  • 再打开另外一个终端,查找与20145227pwn1有关的进程,并用-ef格式显示出来,找到该进程的进程号为2066

  • 打开gdb,用attach指令对该进程进行调试

  • 对foo函数进行反汇编

  • 在ret处设置断点,查看注入buf的内存地址,来分析我们之前猜测的返回地址位置是否正确以及shellcode的地址

  • 图中0x01020304的位置0xffffd30c是返回地址的位置,由于结构为anything+retaddr+nops+shellcode,由此推断我们的shellcode的地址为0xffffd320

  • 将返回地址修改为0xffffd320重新注入,成功!

Return-to-libc攻击深入

Return-to-libc攻击简介

  • shellcode注入攻击在实施时通常首先要将恶意代码注入目标漏洞程序中。但是,程序的代码段通常设置为不可写,因此攻击者需要将此攻击代码置于堆栈中。于是为了阻止此种类型的攻击,缓冲区溢出防御机制采用了非执行堆栈技术,这种技术使得堆栈上的恶意代码不可执行。为了避开这种防御机制,缓冲区溢出又出现了新的变体 return-into-libc 攻击。
  • Return-into-libc攻击方式不具有同时写和执行的行为模式,因为其不需要注入新的恶意代码,取而代之的是重用漏洞程序中已有的函数完成攻击,让漏洞程序跳转到已有的代码序列(比如库函数的代码序列)。攻击者在实施攻击时仍然可以用恶意代码的地址(比如 libc 库中的 system()函数等)来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。这就是为什么攻击者会采用return-into-libc的方式,并使用程序提供的库函数。这种攻击方式在实现攻击的同时,也避开了数据执行保护策略中对攻击代码的注入和执行进行的防护。
  • 攻击者可以利用栈中的内容实施return-into-libc攻击。这是因为攻击者能够通过缓冲区溢出改写返回地址为一个库函数的地址,并且将此库函数执行时的参数也重新写入栈中。这样当函数调用时获取的是攻击者设定好的参数值,并且结束后返回时就会返回到库函数而不是 main()。而此库函数实际上就帮助攻击者执行了其恶意行为。更复杂的攻击还可以通过 return-into-libc的调用链(一系列库函数的连续调用)来完成。

攻击过程

  • 本次实践在32位Linux下进行,先设置32位linux环境。
  • 进入32位linux环境后,将地址随机化关闭,并且把/bin/sh指向zsh:/bin/bash能够通过使shell程序放弃自己的root权限来防范缓冲区溢出攻击及其他利用shell程序的攻击,在本实践中,我们用zsh程序替代/bin/bash程序,解除此防护措施。

  • 将漏洞程序保存在/tmp目录下,并编写20145227retlib.c程序,代码如下:

  • 编译该代码,使用–fno-stack-protector来关闭阻止缓冲区溢出的栈保护机制,并设置给该程序的所有者以suid权限,可以像root用户一样操作:

  • 编写并编译20145227getenvaddr.c。这个程序是用来读取环境变量的,代码如下:

  • 编写攻击程序,写好后先放到tmp目录下。

  • 获取 BIN_SH 地址(如下图为0xffffde21)。

  • 利用gdb获得system和exit地址:

  • 将上述所找到的三个内存地址填写在20145227exploit.c中:

  • 删除刚才调试编译的20145227exploit程序和badfile文件,重新编译修改后的20145227exploit.c:

  • 先运行攻击程序20145227exploit,再运行漏洞程序20145227retlib,攻击成功,获得了root权限:

20145227鄢曼君《网络对抗》shellcode注入&Return-to-libc攻击深入的更多相关文章

  1. 20145227鄢曼君《网络对抗》Web基础

    20145227鄢曼君<网络对抗>Web基础 实验内容 (1)Web前端HTML (2)Web前端javascipt (3)Web后端:MySQL基础:正常安装.启动MySQL,建库.创建 ...

  2. 20145227鄢曼君《网络对抗》逆向及Bof基础

    20145227鄢曼君<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  3. 20145227鄢曼君《网络对抗》Web安全基础实践

    20145227鄢曼君<网络对抗>Web安全基础实践 实验后回答问题 1.SQL注入攻击原理,如何防御? SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是 ...

  4. 20145227鄢曼君《网络对抗》MSF基础应用

    20145227鄢曼君<网络对抗>MSF基础应用 主动攻击:ms08_067漏洞攻击实践 两台虚拟机,其中一台为kali,一台为windows xp sp3(英文版).在VMware中设置 ...

  5. 20145307陈俊达《网络对抗》shellcode注入&return to libc

    20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...

  6. 20145318《网络对抗》注入shellcode及Return-to-libc

    20145318<网络对抗>注入shellcode及Return-to-libc 注入shellcode 知识点 注入shellcodeShellcode实际是一段代码(也可以是填充数据) ...

  7. 20145327《网络对抗》——注入shellcode并执行和Return-to-libc攻击深入

    20145327<网络对抗>--注入shellcode并执行 准备一段Shellcode 老师的shellcode:\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68 ...

  8. 20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结

    20145308 <网络对抗> 逆向及BOF进阶实践 注入shellcode+Return-to-libc攻击 学习总结 实践目的 注入shellcode 实现Return-to-libc ...

  9. 20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

    20144303石宇森<网络对抗>PC平台逆向破解 实验1:shellcode注入 实验基础 1.Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,n ...

随机推荐

  1. Java编程思想中关于闭包的一个例子

    Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...

  2. Spacy 使用

    # 前提是必须安装: python -m spacy download ennlp = spacy.load('en')text = u"you are best. it is lemmat ...

  3. _cs, _ci, or _bin,

    High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko   http:/ ...

  4. IRC and security tools

    login:::   /msg NickServ identify <password>. join:::   /join #metasploit 浏览器: Tor操作系统: Tails加 ...

  5. numpy、pandas、scipy介绍

    https://blog.csdn.net/LOLITA0164/article/details/80195124 numpy简介NumPy(Numeric Python)是一个Python包.它是一 ...

  6. 【find -exec】查找并复制文件

    find . -name *run_server* -type f -exec cp {} /tmp/ \;

  7. IO流(2)创建文件或文件夹

    创建功能: *public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了 *public boolean mkdir():创建文件夹 如果存在这样的文件夹, ...

  8. hibernate注解(三)1+N问题

    一.什么时候会遇到1+N的问题? 前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准 ...

  9. 【JMeter】如何录制创建及得到曲线图

    前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很 ...

  10. Laravel和thinkphp的区别/优缺点

    Laravel的设计思想是很先进的,非常适合应用各种开发模式TDD, DDD和BDD,作为使用者最多的php框架,它为你准备好了一切,composer是个php的未来.laravel最大的特点和处优秀 ...