20145317《网络对抗》shellcode注入&Return-to-libc攻击深入

学习任务

  • shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode 的地址。
  • Return-to-libc 攻击实验:即使栈有不可执行的能力,无法将shellcode放入堆栈中运行,但我们却可以直接让漏洞程序调转到现存的代码来实现我们的攻击。(本次实验所用的是已经载入内存的 libc 库中的 system()函数等)
      
      

基础知识

  • ps -ef | grep pwn1:
      ps:将某个进程显示出来
      ps:将某个进程显示出来
      ps参数:-A  显示所有程序;-e  此参数的效果和指定"A"参数相同;-f  显示UID,PPIP,C与STIME栏位
      ps显示进程结果格式:UID PID PPID C STIME TTY TIME CMD
         UID 程序被该 UID 所拥有
         PID 就是这个程序的 ID
         PPID 则是其上级父程序的ID
         C CPU 使用的资源百分比
         STIME 系统启动时间
         TTY 登入者的终端机位置
         TIME 使用掉的 CPU 时间。
         CMD 所下达的指令为何
      本条命令意为:查找与pwn1有关的进程,并用-ef格式显示出来
  • (gdb) attach: GDB可以对正在执行的程序进行调度,它允许开发人员中断程序并查看其状态,之后还能让这个程序正常地继续执行。在GDB中使用“attach”命令是一个方法。
  • (gdb) disassemble foo: 反汇编一段内存地址,
  • (gdb) c: 继续执行被调试程序,直至下一个断点或程序结束,Continue的简写
  • (gdb) x/16x : 使用x命令(examine的简写)来查看内存地址中的值。
    * x命令的语法:x/<n/f/u>

  • ln -s 源文件 目标文件 :为某一个文件或目录在另外一个位置建立一个同步的链接
  • chmod u+s 文件 :对文件设置强制位,即SET-UID,可以使非文件拥有者或文件所属群组的用户具有执行该文件的权限
  • export [-fnp][变量名称]=[变量设置值] : 设置或显示环境变量。(比如我们要经常使用到一个命令时,而这个命令的执行文件又不在当前目录,这时可以在代码中先执行export,即告诉程序,要执行什么东西时,需要的文件就在这些目录里)
  • echo : 在显示器上显示一段文字
  • gdb -q : -q用以使得gdb不输出gdb程序的版本等信息
  • system :是一个函数,用于运行其它外部程序
      
      

注入Shellcode并执行

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

  • 以 anything+retaddr+nops+shellcode 的结构来构造,先估计返回地址所在位置,并且找到 shellcode 所在地址

  • 要验证返回地址所在位置以及找到 shellcode 地址,需要使用GDB调试
    * 先运行 20145317pwn1 可执行文件

  (先不输入“回车”,在后面的调试过程中需要继续运行的时候再回车,到时候就会显示如图的字符部分)

    * 再找到正在执行的 20145317pwn1 的进程号

     *  进入GDB,联系上该进程号

    *  在 ret 处设置断点,接着运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,并由此分析出返回地址位置的正确性以及shellcode的地址

  (红色方框为返回地址处,红色椭圆为 shellcode 代码,由此推算出 shellcode 地址为 “\x31\xd3\xff\xff”)

    *  继续运行,再次检测是否跳到覆盖的返回地址所表示的地方

  (如红框所示,已经可以确认返回地址是被 \x10\x20\x30\x40 所覆盖的)

    • 将作为输入的 input_shellcode 处的 “\x10\x20\x30\x40” 换为上面所找到的 shellcode 地址 “\x31\xd3\xff\xff”

    • 执行 20145317pwn1 ,成功注入 shellcode

  • Return-to-libc攻击深入

    基础知识

    • 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中的 shellcode。为了阻止这种类型的攻击,一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话,一旦程序执行存放在栈中的 shellcode 就会崩溃,从而阻止了攻击。

    • 现在存在一种缓冲区溢出的变体攻击,叫做 return-to-libc 攻击。这种攻击不需要一个栈可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码来实现我们的攻击。攻击者在实施攻击时仍然可以用恶意代码的地址(比如 libc 库中的 system()函数等)来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。这就是为什么攻击者会采用return-into-libc的方式,并使用程序提供的库函数。这种攻击方式在实现攻击的同时,也避开了数据执行保护策略中对攻击代码的注入和执行进行的防护。

    实践过程

    • 输入如下命令,安装一些用于编译32位C程序的东西。(因为这一步忘了截图,所以用的是老师的图~)
    • 输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash。

    • Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆和栈的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们要关闭这一功能。

    • linux 系统中,/bin/sh 实际是指向/bin/bash 或/bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个 shell 程序(zsh)代替/bin/bash。

    • 把以下代码(漏洞程序)保存为“retlib.c”文件,保存到 /tmp 目录下。代码如下:

    • 编译该程序,并设置 SET-UID,命令如下。“gcc -z execstack -o test test.c” 表示栈可执行;"gcc -z noexecstack -o test test.c"表示栈不可执行。GCC 编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 “–fno-stack-protector” 关闭这种机制。

    • 我们还需要用到一个读取环境变量的程序,再编译一下。

    • 把以下代码(攻击程序)保存为“exploit.c”文件,保存到 /tmp 目录下。代码如下。

    • 代码中“0x11111111”、“0x22222222”、“0x33333333”分别是 BIN_SH、system、exit 的地址。
    • 需要我们接下来获取。用刚才的 getenvaddr 程序获得 BIN_SH 地址。

    • gdb 获得 system 和 exit 地址。

    • 修改 exploit.c 文件。

    • 删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c,然后先运行攻击程序 exploit,再运行漏洞程序 retlib,可见攻击成功,获得了 root 权限

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

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

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

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

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

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

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

  4. 20145317 网络对抗技术 逆向与Bof基础

    20145317 网络对抗技术 逆向与Bof基础 实践要求 1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码 2. 掌握反汇编与十六进制编程器 3. 能正确修改机器指令改变程序执行流程 ...

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

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

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

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

  7. 20145211《网络对抗》注入Shellcode并执行&&Return-to-libc攻击

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

  8. 20145310《网络对抗》注入shellcode及Return-to-libc

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

  9. 20145315《网络对抗》——注入shellcode以及 Return-to-libc攻击实验

    shellcode 准备一段Shellcode 我用的老师的shellcode:\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3 ...

  10. 20145320《网络对抗》注入Shellcode并执行

    20145320注入Shellcode并执行 准备一段Shellcode 首先先准备一段C语言代码:这段代码其实和我们的shell功能基本一样 为了之后能够看到反汇编的结果,这次采用的静态编译.正常返 ...

随机推荐

  1. JSTL 学习

    对于页面访问数据的统计,可以使用内置对象的相应方法进行计数工作,这个对象要在jsp对象的整个生命周期中setAttribute()和getAttribute()application.setAttri ...

  2. android call and audio

    mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system ConnCtl *:s android audio (http://blog.cs ...

  3. 解决eslint空格报错等问题

    eslint检查代码风格是好的,不过 有些换行报错   空格报错  还有在代码中有 console也是报错   这有些烦人 为了把这些烦人的报错给禁止掉 我们可以在package.json文件中 找到 ...

  4. latex 安装和使用

    1:下载 texlivewindows 版  http://tug.org/texlive/acquire-netinstall.html 2:双击exe文件进行安装,安装时选择 将路径添加到环境变量 ...

  5. jpress-配合nginx与tomcat安装

    目录 1. 前言 2. yum安装tomcat 2. yum安装MySQL 3. 下载JPress并安装 4. 配置tomcat使其可以部署多个网站 5. 安装nginx并配置 6. 将已经安装好的j ...

  6. [LeetCode] 674. Longest Continuous Increasing Subsequence_Easy Dynamic Programming

    Given an unsorted array of integers, find the length of longest continuous increasing subsequence (s ...

  7. isKindOfClass isMemeberOfClass 的区分

    isKindOfClass If you use such constructs in your code, you might think it is alright to modify an ob ...

  8. STL学习笔记--特殊容器

    容器配接器 (1) stack 栈 后进先出(LIFO), 头文件#include<stack> template<class _Ty, class _Container = deq ...

  9. selenium webdriver模拟鼠标键盘操作

    在测试使用Selenium webdriver测试WEB系统的时候,用到了模拟鼠标.键盘的一些输入操作. 1.鼠标的左键点击.双击.拖拽.右键点击等: 2.键盘的回车.回退.空格.ctrl.alt.s ...

  10. c++中的构造(包括移动),赋值(包括移动),析构详解

    这五种操作:构造(包括移动),赋值(包括移动),析构其实就是定义了对一个对象进行构造,赋值,析构时的行为.理解这些行为并不复杂,复杂的是理解在继承下这些行为的表现.需要注意的是他们并不会被继承(传统意 ...