缓存区溢出攻击实验(3)

缓存区溢出攻击实验(3)

本实验预计分 3 个小实验来做,本文是第三个实验。

本实验跪谢大神 YSunLIN 的帮助与指导 ~

不保证成功,一切皆有可能 ~

背景介绍

请参照实验(1)(2)。

实验目的

最终目的:只给一个需要输入正确的序列号才能验证通过的exe可执行文件,要求在不知道源代码的情况下利用缓存区溢出攻击来破解该exe文件

注意!!!

不知道源代码的情况下

不知道源代码的情况下

不知道源代码的情况下

现实中,在实际的攻击中我们不可能直接拿到程序的源代码,因此最有可能的情况下就是只提供了可执行文件进行破解,打开的时候(如果exe没有防止反汇编的话)利用反汇编可以看到汇编语言,仅此而已。我们要做到的就是破解这个exe,成功的衡量标准是通过序列号的验证

当然,由于我们只是一个简单的入门实验,所以在具体实验中这个exe文件的源码是有提供的,仅仅是用来提示我们到底要用什么方法才能破解成功。不过最终目的还是如上,

实验环境

源代码

跟前面说的一样,在攻击中我们是不知道源代码的,但在本实验中我们提供了源代码仅用来提示大概可能有什么攻击的思路。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string.h>

int main() {
    char in[20];
    printf("Enter Serial Number\n");

    scanf("%s", in);
    if (!strncmp(in, "S123N456", 8)) {
        printf("Serial Number is correct\n"); // 衡量成功的标准就是执行了该语句
    }

    system("pause");
    return 0;
}

程序截图

  • 正常开启

  • 成功的标志是输出该行

破解

下面要开始思考如何破解了。虽然本实验的目的是利用 缓存区溢出攻击,不过这里还是主要考虑如何破解,不一定是利用缓存区溢出攻击。

以下破解思路大多归功于 YSunLIN ~

破解方法一

猜测

也许匹配的字符串放在全局缓冲区

破解过程

  1. 执行程序,(使用 VS 进行)反汇编得到汇编语言代码
  2. 找到 jne 命令,该命令一般用来跳转,猜测这里就是判断之后的跳转语句
  3. 找到 jne 之前的上一个类似 push 352134h 的语句,记住这个地址,一般这种形式可能是全局缓冲区的地址。如图:

  4. 在内存中搜索地址 0x352134,可得到匹配的字符串 S123N456,如图:

结论

这个方法只是比较取巧,然而现在的密码基本不会用明文存储了。。输入的字符串也会经过一些处理才跟密码进行匹配,so :(

破解方法二

思路

调试的时候在汇编语言处加断点,直接修改寄存器。

这个倒是没有实现,实际上是尝试用 Visual Studio 进行反编译之后,在跳转地方加了断点,查看寄存器,可看不可修改,因此没有做进一步尝试。

如果能找到能够对程序进行反编译、并且在执行过程中修改寄存器的工具的话,这个方法也许可行。

破解方法三

这个方法需要知道源代码,所以不能达到我们的最终目的。写在这里只是为了记录有这么个方法。

使用实验(1)(2)的方法,由于 main 函数执行完毕之后也需要返回,必然有个返回地址的跳转,我们在 if 判断语句打断点可以知道 print 语句的地址;在 return 处打断点可以知道 main 函数执行完毕之后的返回地址,搜索内存可以知道我们输入的数据与 main 函数返回地址之间相差的字节数,从而在输入数据的时候让其溢出,让 print 语句的执行地址覆盖 main 函数的返回地址。

实测可行(在知道源代码的情况下),由于跟实验(1)(2)方法类似,这里就不做过多阐述了。

破解方法四

思路

这个思路应该才是本实验想让我们实现的思路,采用缓冲区溢出攻击来破解。

类似前面的实验(1)和(2),我们想利用读入数据这一过程,将输入值拉长到可以覆盖栈里某些跳转的地址,达到跳转的目的。

这里有两个问题我们要解决,就是

  1. 修改哪里的跳转地址?

    如果没有看到源代码,我们不知道里面有什么函数,不知道里面有什么跳转,所以这里考虑利用 main 函数的 ret 来进行跳转

  2. 跳转到哪里?

    既然是输入一个值如果正确则通过验证,这里必然有判断之后进行跳转的过程。我们考虑跳转到判断的另一个分支

ok,思路有了,我们进行实验。

过程

  1. 执行程序,(使用 VS 进行)反汇编得到汇编语言代码
  2. 找到 j 开头的汇编指令,该指令一般用来跳转,猜测这里就是判断之后的跳转语句,得到判断之后跳转的地址
  3. 在汇编语言代码中找到 ret 指令,打上断点,程序运行结束之前我们可以劫到 main 函数的返回地址(这里可能要在内存中搜索 esp

为什么这里没有图

因为实际操作中有个问题,就是寻到需要跳转到的地址之后我们要输入数据,让缓冲区溢出对 main 函数的返回地址进行覆盖,可是这里有几个点:

  1. 汇编指令地址是 32 bit 的
  2. 输入的字符串中每个字符占 1 byte,即 8 bit
  3. 也就是说我们要用 4 个字符来表示这个地址
  4. 输入字符串都以 ASCII 码方式来读取
  5. ASCII 码能表示的字符只有 128 个

坑爹的地方来了!

假如地址中出现 7F(十进制的 127)之后的地址,我们是无法用 ASCII 方式表示出来的…

po主卒。(┬_┬)

最后几句话

  1. 攻击不一定成功
  2. 一边猜测一边尝试着攻击
  3. 运气肯定是需要的
  4. 好的工具可以节省很多功夫
  5. 信息安全水很深:-P
时间: 2024-08-03 14:07:52

缓存区溢出攻击实验(3)的相关文章

CSAPP lab3 bufbomb-缓冲区溢出攻击实验

完成这个实验大概花费一天半的时间,看了很多大佬的博客,也踩了很多的坑,于是打算写一篇博客重新梳理一下思路和过程,大概会有三篇博客吧. 实验目的: 通过缓冲区溢出攻击,使学生进一步理解IA-32函数调用规则和栈帧结构. 实验技能: 需要使用objdump来反汇编目标程序,使用gdb单步跟踪调试机器代码,查看相关内存及寄存器内容,也需要学生掌握简单的IA32汇编程序编写方法. 实验要求: 5个难度等级(0-4逐级递增) 级别0.Smoke(candle):构造攻击字符串作为目标程序输入,造成缓冲区溢

缓存区溢出检测工具BED

缓存区溢出(Buffer Overflow)是一类常见的漏洞,广泛存在于各种操作系统和软件中.利用缓存区溢出漏洞进行攻击,会导致程序运行失败.系统崩溃.渗透测试人员利用这类漏洞,可以获取系统权限,远程执行命令等.Kali Linux提供的BED工具(Bruteforce Exploit Detector)是一款缓存区漏洞检测工具.它预置了十一种插件.这些插件针对不同的服务或系统,如FTP.SMTP.POP等.同时,这些插件内包含了已知的各种攻击载荷. BED通过加载插件,向目标主机发送攻击数据.

CSAPP缓冲区溢出攻击实验(下)

CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将global_value的值修改为cookie.因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆盖global_value的值.若修改了.bss和.text之间某些只读的段会引起操作系

CSAPP缓冲区溢出攻击实验(上)

CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数名(bufbomb -t)的差异,不影响我们的实验. 1.实验工具 1.1 makecookie 后面实验中,五次"攻击"中有四次都是使你的cookie出如今它原本不存在的位置,所以我们首先要为自己产生一个cookie. 实验工具中的makecookie就是生成cookie用的.參数是你的

缓存区溢出的基本原理

缓存区溢出是由于当被被溢出程序/系统调用类似于read().sprintf()\strcpy()等函数时向程序的内存空间中写入字符串,一般程序会将其放入堆或栈数据结构中 .若其对写入数据大小没有严格限制,则可能引起数据覆盖函数调用时压栈的esp栈顶指针及eip返回值,通过精心设计的写入数据,可以控制其返回值从而达到夺取控制权的效果. 由于我们的程序是以字符串的形式写入内存,所以 应避免空字符00的出现(函数会将其识别为结束字符串‘\0’,从而将我们构造的shellcode从中间截断.)但有时我们

2018-5-2 缓冲区溢出攻击实验

2018-5-2 缓冲区溢出攻击实验 实验环境:实验楼自带的linux虚拟系统 1.sudo apt-get update 更新linux,主要是下载C的编译器 2.进入linux操作环境并使用bash 3.关闭系统地址的随机分配,立于之后寻址找到有漏洞的缓冲区. 此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权.因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/b

缓冲区溢出攻击实验(另附源代码)

缓冲区溢出攻击代码如下: #include<Windows.h> #include<stdio.h> #include<string.h> void f(char *input) { char buffer[10]; strcpy(buffer,input); printf("缓冲区字符为=%s",buffer); /* // 进行防御,当输入长度过长时跳出 char buffer[10]; int b; b=strlen(input); if(b&

关于缓存区溢出的这段经典代码为什么编译失败xvs

深秋时节,落叶遍地 浮游在落叶的深海里,偶尔探头出来仰望天空,才发现已经忘记曾经的誓言~ 若不是风激起了千层浪,你又如何发现心中的那一片深藏的角落有着你最初的梦想 曾几何时,你却忘了 肃秋的寒冷?,无人能懂. 又是一季感伤时 悲伤入侵,誓言下落不 情感失落时,造访最初的故地,伴夕阳秋雨.若此般境遇,怎番滋味.雨不慎溅至容颜,油然而生的愁怎能仍固挂在心头. 题记 曾几何时,我眷恋过那一片远山. 前阵子,天空下着淅淅沥沥的细雨,深秋之后的雨有种别样的感觉,哀怨沧凉,婉约明细.我望着远山,分 明明知道

20165315 缓冲区溢出漏洞实验

20165315 缓冲区溢出漏洞实验 一.实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验步骤 1.前期准备 实验楼提供的是 64 位 Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此实验之前需要做一些准备: 输入命令安装一些用于编译 32 位 C 程序的软件包: s