20145316许心远《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

shellcode注入实践

编写shellcode
  • 这一部分在我上一篇日志里面已经详细讲过了,这里直接把验证合适的shellcode拿过来。
  • \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\

    准备工作,设置环境

    886492-20170319205148245-1404908377.png

    构造要注入的payload
  • Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,nop+shellcode+retaddr。因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边。
  • 实践证明nop+shellcode+retaddr对于pwn1不是成功的payload,但我们依然决定往这个坑里跳一下。手动微笑。

    payload结构为nop+shellcode+retaddr
    1.编写payload
    886492-20170319205206432-471123877.png
  • 特别提醒:最后一个字符千万不能是\x0a。\x0a相当于回车键,若回车了下面的操作就做不了了。

    2.打开一个新终端(终端2),将payload注入到pwn1中(此处有天坑!!!一定要仔细!!!)
  • 敲好(cat input_shellcode;cat) | ./pwn1后这里有三种状态,这三种状态中只有一种才能让接下来的实验顺利进行。
    886492-20170319205226120-1062723389.png
    886492-20170319205239198-1201160079.png
    886492-20170319205252432-1084611653.png
  • 答案就是第一种。我做实验的时候被这里坑住了很久,一切都正常但到后面查看寄存器的时候上翻了几十行就是找不到shellcode,问题就出在这里,大家在这里千万不要手滑多敲回车(到下面提示的地方再敲),要不然都得重新来过。
  • 保持终端2中程序的运行状态。

    3.终端1中查询pwn1进程的UID

    886492-20170319205306948-1409681872.png

    4.gdb调试,进入对应UID端口

    886492-20170319205330291-1248463836.png

    5.反汇编,设置断点
    886492-20170319205343620-1732965943.png
  • 注意:continue执行的时候,在终端2敲一下回车,终端1中的continue暂停在断点处。

    6.往上查询找到shellcode,同时找到要覆盖的地址
    886492-20170319205428620-1501841591.png
  • 要覆盖的地址(返回地址)是0xffffd300

    7.更改payload,测试,不成功
  • 0xffffd300替换0x01020304
    886492-20170319205509323-1889898140.png

    payload结构为retaddr+nop+shellcode
  • 重新构造payload
    886492-20170319205554682-1302127077.png
  • 成功
    886492-20170319205618088-1177029893.png

    return-to-libc实验

    配置32位linux环境
  • sudo apt-get update
  • sudo apt-get install lib32z1 libc6-dev-i386
  • sudo apt-get install lib32readline-gplv2-dev

    添加新用户
  • 因为我们最后的是要通过看“是否取得root权限”来判断成功与否的,所以攻击对象不能是root用户,要创建一个新用户。
    886492-20170327140303248-170102741.png

    设置实验背景
  • 进入32位环境,关闭地址随机化,设置zsh程序代替/bin/bash
    886492-20170327140318608-51809285.png

    在/tmp文件夹下编写漏洞程序retlib
    886492-20170327140337498-1615819178.png
  • 在root用户下编译,关闭栈保护机制。设置SET-UID
    886492-20170327140348998-41467862.png

    在/tmp文件夹下编写getenvaddr和exploit
  • getenvaddr用来读取环境变量
    886492-20170327140405733-533570.png
  • exploit用来攻击
    886492-20170327140416654-866631725.png
  • 同样是在root用户下编译
    886492-20170327140427076-923187042.png
    886492-20170327140436639-1828976434.png

    获取地址并修改exploit
  • 获取BIN_SH地址
    886492-20170327140450748-469766932.png
  • 进入gdb设置断点,调试运行获取system和exit地址
    886492-20170327140501748-1054925702.png
  • 将上述三个地址修改入exploit.c文件
    886492-20170327140514420-1723218149.png
  • 删除之前生成的exploit和badfile(我的exploit因为有权限无法命令行删除,索性直接在places下面的图形化界面tmp文件夹里手动删除)
    886492-20170327140530451-1426909986.png

    攻击,成功
  • 先运行exploit再运行retlib即可获得root权限,成功!
    886492-20170327140547342-878116474.png

转载于:https://www.cnblogs.com/xxy745214935/p/6582228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值