带你一步一步实战分析缓冲区溢出漏洞攻击

关注公众号有惊喜【部分付费文章免费阅读,持续更新中…】

在这里插入图片描述
点击公众号底部【逆向杂记】可见

文件1

(A)描述此二进制文件提供的服务,不需要运行二进制文件来找出这一点。
(B)有可能对此二进制文件进行缓冲区溢出攻击,它在哪里?哪些输入将触发它,并且攻击者可能会使用此溢出来做什么?
文件名1
格式:x86

逆向分析1

文件功能逆向

用32位ida加载文件后,反编译main函数,如下

int __cdecl main(int argc, const char **argv, const char **envp)
{char Buffer; // [esp+5Ch] [ebp-2004h]int UserInput; // [esp+205Ch] [ebp-4h]UserInput = 0;puts("Usage:\n  list - list all public keys\n  view <email> - view a singular entry\n  exit - leave the program\n");while ( 1 ){UserInput = readline((int)"> ");if ( !UserInput )break;if ( *(_BYTE *)UserInput ){if ( !strncmp("exit", (const char *)UserInput, 5u) )return 0;if ( !strncmp("list", (const char *)UserInput, 5u) ){list();}else if ( !strncmp("view ", (const char *)UserInput, 5u) ){view((char *)(UserInput + 5));}else if ( !strncmp("shell", (const char *)UserInput, 6u) && prereq == 11 ){snprintf(&Buffer,0x2000u,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",47,98,105,110,47,98,97,115,104,32,45,105,32,50,62,38,49);system(&Buffer);}else{prereq = 3;puts("invalid command!");}add_history(UserInput);free((void *)UserInput);UserInput = 0;}}return 0;
}

可以看出,程序首先是提示用户输入,然后是if…else if…else分支语句进行判断。如果输入的字符串不是list、view、exit等,则给prereq变量赋值为3,且打印信息"invalid command!",然后将输入的内容保存到历史输入清单中(add_history),即

(1)若没有输入任何信息,则直接退出循环,返回0,程序退出;

(2)若输入字符串”exit”,则返回0,程序退出;

(3)若输入字符串”list”,则调用list函数;

  • 反编译list函数,如下
int list()
{int result; // eaxchar list_UserInput; // [esp+1Ch] [ebp-200Ch]FILE *stream; // [esp+201Ch] [ebp-Ch]stream = popen("gpg --list-keys", "r");while ( fgets(&list_UserInput, 0x2000, stream) )fputs(&list_UserInput, stdout);if ( ferror(stream) )perror("fgets()");pclose(stream);result = prereq + 5;prereq += 5;return result;
}

list函数:将文件gpg --list-keys中的内容读入到缓冲区list_UserInput中,读入长度为0x2000,返回值为prereq+5,且令prereq的值加5。

(4)若输入字符串”view”,则调用view函数;

  • 反编译view函数,如下
int __cdecl view(char *s2)
{int result; // eaxchar s; // [esp+2Ch] [ebp-400Ch]char v3; // [esp+202Ch] [ebp-200Ch]FILE *stream; // [esp+402Ch] [ebp-Ch]if ( isemail(s2) ){if ( !strncmp("XXXX@XXXX", s2, 0x1Au) ) //XXXX@XXXX表示邮箱地址,隐掉了prereq *= 2;elseprereq = 3;snprintf(&s, 0x2000u, "%s %s", "gpg --list-keys", s2);stream = popen(&s, "r");while ( fgets(&v3, 0x2000, stream) )fputs(&v3, stdout);if ( ferror(stream) )perror("fgets()");result = pclose(stream);}else{prereq = 3;result = puts("no valid email given!");}return result;
}

view函数

  • 用户输入的第5个字符开始,判断是否为邮箱地址,如果为邮箱地址,则再判断邮箱是否为 XXXX@XXXX,如果是该邮箱,则prereq乘以2,否则prereq赋值为3。

  • 格式化字符串” gpg --list-keys ”+邮箱地址,打开以该字符串为文件名的文件,读取其中内容到缓冲区。

  • 如果不是email,则prereq=3。

(5)若输入字符串”shell”,且prereq变量值为11,则调用snprintf函数将一串指令格式化字符串变量中,然后调用system函数执行该指令。

(6)若输入的字符串均不是以上步骤中的字符串,则赋值prereq为3,并打印”invalid command!”

缓冲区溢出漏洞

main函数中变量Buffer的堆栈地址如下:

-00002004 Buffer          db ?
-00002003                 db ? ; undefined
-00002002                 db ? ; undefined
-00002001                 db ? ; undefined
-00002000                 db ? ; undefined
-00001FFF                 db ? ; undefined
-00001FFE                 db ? ; undefined
-00001FFD                 db ? ; undefined
......

list函数中list_UserInput的堆栈地址如下:

-0000200C list_UserInput  db ?
-0000200B                 db ? ; undefined
-0000200A                 db ? ; undefined
-00002009                 db ? ; undefined
-00002008                 db ? ; undefined
-00002007                 db ? ; undefined
-00002006                 db ? ; undefined
-00002005                 db ? ; undefined
-00002004                 db ? ; undefined
-00002003                 db ? ; undefined

view函数中viewBuffer的堆栈地址如下:

-0000200C viewBuffer      db ?
-0000200B                 db ? ; undefined
-0000200A                 db ? ; undefined
-00002009                 db ? ; undefined
-00002008                 db ? ; undefined
-00002007                 db ? ; undefined
-00002006                 db ? ; undefined
-00002005                 db ? ; undefined
-00002004                 db ? ; undefined
-00002003                 db ? ; undefined
-00002002                 db ? ; undefined

攻击点在缓冲区0x200C地址处,触发思路如下:

(1)利用list、view等函数的输入,使得prereq的值改为11;且在文件gpg --list-keys文件和以gpg --list-keys + email为文件名的文件中放入需要执行的代码,前提是算好文件中指令执行的起点。

(2)在主界面输入”shell”,即可执行文件中的指令,而文件是可以人为改变的,从而达到某些特殊的目的。具体的样例因为时间就不仔细推算了。

文件2

此二进制文件检查密码,并允许缓冲区溢出。
(A)分析该二进制文件并查找需要输入的密码,解释该二进制文件如何检查密码,并说明密码是什么。您不需要运行此二进制文件。
(B)此二进制文件可能受到缓冲区溢出攻击,在哪里?什么输入会触发它,攻击者可以利用这个溢出做什么?
文件名:file2xjfk95
格式:x64

逆向分析2

文件功能逆向

用64位IDA加载文件,反编译main函数,如下

int __cdecl main(int argc, const char **argv, const char **envp)
{char UserInput[28]; // [rsp+10h] [rbp-20h]int i; // [rsp+2Ch] [rbp-4h]if ( argc > 1 )processFlags(argv[1], argv, envp);puts("Enter password:");fgets(UserInput, 999, _bss_start);for ( i = 8; i >= 0; --i ){if ( UserInput[i] != a[8 - i] ){puts("Wrong");exit(0);}}return puts("Well done, that is the correct password");
}

UserInput和缓冲区a的关系是:

UserInput[i]=a[8-i]

i从8递减至0,共9位;

循环检查,如果不满足该关系则打印”Wrong”,并退出。查看缓冲区a,如下

.data:0000000000601060 a               db 'B'                 
.data:0000000000601061 aA3lWhgf        db 'A3l*whgf',0

由此可推算出正确密码 :fghw*l3AB

缓冲区溢出漏洞

缓冲区溢出攻击在堆栈中,堆栈如下:

-0000000000000030 var_30          dq ?
-0000000000000028                 db ? ; undefined
-0000000000000027                 db ? ; undefined
-0000000000000026                 db ? ; undefined
-0000000000000025                 db ? ; undefined
-0000000000000024 var_24          dd ?
-0000000000000020 UserInput       db 28 dup(?)
-0000000000000004 looptimes       dd ?
+0000000000000000  s              db 8 dup(?)
+0000000000000008  r              db 8 dup(?)
+0000000000000010

可以看到,UserInput缓冲区大小为0x1c=28个字节,后面紧跟着的4个字节存储的是循环次数(looptimes),而fgets获得输入的字符串长度为999,因此可以在此处进行缓冲区溢出攻击,用户任意输入28个字符,再接着输入

\xff\xff\xff\xff\xff\xff\xff\xff(即将循环次数置为-1)

那么程序执行后for循环一开始便获得i的值为-1,不满足循环条件,即不执行循环体,直接执行最后一行,打印:“Well done, that is the correct password”

即攻击者可利用这个溢出直接绕过密码验证阶段,达到特殊的目的。

攻击输入样例:
0123456789012345678901234567\xff\xff\xff\xff\xff\xff\xff\xff

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界&#xff08;泛型的协变&#xff09; 4.通配符下界&#xff08;泛型的逆变&#xff09; 5.泛型的编译&#xff08;擦除机制&#xff09; 泛型 泛型&#xff1a;就是让一个类能适用于多个类型&#xff0c;就是在封装数据结…

Python实验三:Python程序设计之组合数据类型

微信公众号&#xff1a;创享日记 发送&#xff1a;python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习…

Python爬虫和数据分析,石油原油加工产品产量数据处理分析

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;原油分析 获取完整无水印报告P…

Python实验二:Python程序设计之结构与复用

微信公众号&#xff1a;创享日记 发送&#xff1a;python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习…

基于x86汇编的飞机大战

运行结果 代码 ;宏定义一个显示函数(显示一组字符串) PUTS MACRO STRINGPUSH AXPUSH DXLEA DX, STRING ;LEA将内存地址的

Python实验四:Python程序设计之文件

微信公众号&#xff1a;创享日记 发送&#xff1a;python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习…

【OFDM系列1】OFDM调制原理、参数、循环前缀、采样偏差、频偏及估计详解

关注公号【逆向通信猿】回复【OFDM】更精彩!!! OFDM调制解调原理 星座映射==>插入导频==>IFFT调制==>插入CP==>定时==>FFT解调==>导频均衡==>判决恢复 OFDM的正交条件[樊昌信,通信原理]: ①子载波 f k = k 2 T f_k=\frac{k}{2T}

Python统计英文单词出现情况次数实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 请统计附件hamlet.txt中出现的英文单词情况&#xff0c;统计并输出出现…

Java EE 8安全性API:概述

新的安全性API 可能&#xff0c;添加到Java EE 8中最重要的一项新功能就是新的安全性API。 此新API的主要动机是简化&#xff0c;标准化和现代化跨容器和实现处理安全性问题的方式。 他们做得很好。 由于三个新的注释使web.xml文件声明变得多余&#xff0c;Web身份验证的配置…

基于SSH的校园网上购物系统Javaweb、MySQL、JSP

微信公众号&#xff1a;创享日记 发送&#xff1a;校园购物 获取完整论文报告项目Java和SQL源码源文件答辩PPT等 主要内容&#xff1a; 1&#xff0e;对校园网上购物平台的建设需求进行分析&#xff0c;包括产品、服务方式等。 2&#xff0e;按需求对各个功能模块进行设计。 3&…

Python传感器采集数据文件分析处理实验源码

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 附件sensor-data.txt是一个传感器采集数据文件&#xff0c;其中&#…

Java Stream ORM现在带有JOIN

Speedment是一个Java Stream ORM工具包和运行时&#xff0c;它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL&#xff0c;因此该应用程序变得更加紧凑&#xff0c;从而使其开发速度更快&#xff0c;更不容易出错并且更易于维护。 流也严格地是类型安…

易购数码类电商商城网页设计与实现项目源码

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;易购网站 获取完整报告论文源…

Python定义一个单链表可判断是否为空,计算长度,插入节结点实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 使用python定义一个单链表&#xff0c;并实现以下功能&#xff1a; (…

复信号两种不同加噪方式的比较

方式一 分别对信号实部和虚部加噪&#xff0c;SNR30&#xff0c;然后将实部和虚部合起来变成复信号&#xff0c;计算合起来之后的信号与噪声功率之比 %% 测试加噪方式 clear;close all;clc; M4;len10000; xk randi([0,M-1],1,len); xk pskmod(xk,4); SNR 30; xkR real(xk…

Python统计各省份字典中双一流学校数量实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 字典d中存储了我国42所双一流高校及所在省份的对应关系&#xff0c;请…

servlet文件上传下载_Servlet上传文件和下载文件示例

servlet文件上传下载Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 &#xff0c;因此我想提供一个使用servlet上传和下载文件的示例示例。 用例 我们的用例是提供一个简单HTML页面&#xff0c;客户端可以在其中选择要上传到服务…

Ollydbg使用教程学习总结(一)

解密系列之OD使用教程1 使用例子程序为Hello.exe OD基本快捷键及功能 从系统DLL领空返回到程序领空&#xff0c;AltF9 通过OD将程序的标题“Hello world”改为“OD Class 01” 直接单步执行法 按F8单步执行&#xff0c;找到MessageBox传参的地方&#xff0c;直接在数据窗口修…

Python连锁药店营业额数据分析实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 附件drug. order_ detai 1.xlsx是某连锁药店销售数据&#xff0c;请使…

Python计算细胞核与细胞质的面积比opencv或pil实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 根据附件cell.jipg&#xff0c;使用opencv库或者PIL库计算细胞核与细胞…