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

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的地址为0xffffd320linux

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

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权限:

相关文章
相关标签/搜索