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. SQL Fundamentals:Restricting and Sorting Data限制和排序数据(FROM-WHERE-SELECT-ORDER BY)

    SQL Fundamentals || Oracle SQL语言 控制操作的显示列:基本的SELECT语句 控制行:限定查询和排序显示 分组统计查询 限定查询:WHERE字句 排序显示:ORDER B ...

  2. deque Comparison of Queue and Deque methods Comparison of Stack and Deque methods

    1. 队列queue和双端队列deque的转换 Queue Method Equivalent Deque Methodadd(e) addLast(e)offer(e) offerLast(e)re ...

  3. scrollView + tableview 上下滑动失效

    scrollView + tableview 上下滑动失效 控制器添加的  要加到子控制器,不然被销毁了 [self addChildViewController:chatVC];

  4. linux环境下python的部署

    linux系统环境自带python2.6,但有时我们项目使用的版本可能是3.x以上等等,此时我们需要在linux中再安装项目所需的python版本,此时就涉及多版本共存问题了,很多同学在安装多个版本P ...

  5. 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ

    正解:贪心+倍增+二分答案 解题报告: 正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题 其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了... 从标 ...

  6. javascript 调用cookies

    cookie   用来保存信息,并且与服务器互动,因此前端后端都可以使用cookie     值得一提的是:虽然cookie是以文件的形式存储在客户端的电脑上, 但浏览器只会让创建cookie的网站访 ...

  7. 深入浅出REST(转载)

    add by zhj: 参考http://zh.wikipedia.org/zh/REST 需要注意的是,REST是设计风格而不是标准,它也并没有与哪种协议绑定.不过,我们常按REST设计风格来使用H ...

  8. 发现《深入理解C++11》中扩展的friend代码的错误

    目前在总结现代C++的新特性,看了<深入理解C++11>这本书. 今天看到扩展的friend语法这一节,遇到了问题.本节电子版内容参见:https://book.2cto.com/2013 ...

  9. requesMapping注解

    java类 package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; impor ...

  10. 循环结构 while,do while

    while:先判断条件表达式是否成立,成立则执行循环体,不成立则不执行. 格式:while(条件表达式){ 执行语句(控制循环次数): } 例如: int x=1; while(x<3/*条件表 ...