1.栈溢出的利用

1.进程使用的内存都可以按功能大致分为以下4个部分:
(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。

(2)数据区:用于存储全局变量等。

(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后还给堆区。动态分配和回收是堆区的特点。

(4)栈区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。

 

 

2.Win32系统提供两个特殊的寄存器用于标识位于栈系统顶端的栈帧。

(1)ESP:栈指针寄存器,其内存放着一个指针,改指针永远指向系统栈最上面的一个栈帧的栈顶。

(2)EBP:基址指针寄存器,其内存放着一个指针,改指针永远指向系统栈最上面一个栈帧的底部。

(3)EIP:指令寄存器,其内存放着一个指针,该指针永远指向下一条等待执行的指令地址。

 

一个栈溢出利用实验

 

 今天看了一个关于溢出的小实验,挺好玩的,于是自己也想玩玩,首先看看这个实验的源码。

我们准备在password.txt文件中植入二进制的机器码,在password.txt攻击成功时,密码验证程序应该执行植入代码,并在桌面上弹出一个消息框显示“failwest”字样.

首先我们要完成的几项工作:

(1)分析并调试漏洞程序,获得淹没返回地址的偏移。

(2)获得buffer的起始地址,并将其写入password.txt的相应偏移处,用来冲刷返回地址。

(3)向password.txt中写入可执行的机器代码,用来调用API弹出一个消息框。

 

如果在password.txt中写入恰好44个字符,那么第45个隐藏截断符NULL将冲掉authenticated,低字节中的1,从而突破密码证的限制。  

 

正如我们所料,authenticated被冲刷后,程序直接进入验证通过的分支。

(1)buffer数组的起始地址位0x0018FB44

(2)password.txt文件中第53~56个字符的ASCLL码将写入栈帧的返回地址,成为函数返回后执行的指令地址。

 

用汇编语言调用MessageboxA需要3个步骤:

(1)装载动态链接库user32.dll。MessageBoxA是动态链接库user32.dll的倒出函数。

(2)在汇编语言中调用这个函数需要获得这个函数的入口地址。

(3)在调用前需要向栈中按从右向左的顺序压入MessageBoxA。

 

  

 

  为了让植入的机器代码更加简洁明了,我们在实验准备中构造漏洞程序的时候已经人工加载了user32.dll这个库,多以可以不用考虑第一步。

    MessageBoxA的入口参数可以通过user32.dll在系统中加载的基址和MessageBoxA在库中的偏移相加得到。(具体可以使用vc自带工具“Dependency  Walker“获得这些信息) 

   好吧 ,我的vc没有这个功能,只有在OD中去找了。

入口地址=7599FD1E

将以下汇编代码一十六进制形式抄入password.txt。

第53~56字节为buffer的起始地址,最后保存,当再次打开程序的时候

果然和我们预想的一样,出现了对话框,点击确定后程序就会崩溃。

 

到此就全部结束了,最重要的地方就是MessageBoxA的地址和buffer的起始地址,并且buffer的起始地址要恰好覆盖掉第53~56个字符栈帧的返回地址。

时间: 2024-10-22 16:10:54

1.栈溢出的利用的相关文章

栈溢出的利用

栈溢出的利用 我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解.再进行讲一遍栈溢出的原理.更加熟悉栈溢出的原理能够让我们更好地利用栈溢出. 下面的例子代码如下:(代码很简单我不做解释) #include <stdio.h> #include<string.h> #define PASSWORD "qqqqqqq" int verify_password(char *password)

Android栈溢出漏洞利用练习

在Github上看到一个Linux系统上的栈溢出漏洞利用练习项目: easy-linux-pwn.在原项目基础上,我稍微做了一些改动,将这个项目移植到了Android 9.0系统上: easy-android-pwn.对Android漏洞利用有兴趣的可以练习一下. 由于Android系统与其他Linux桌面系统在安全配置上有下面两方面的差异,导致此项目不能直接在Android系统上使用.需要对系统做一些改动,重新编译ROM(或者仅编译替换linker程序). 即使通过echo 0 | sudo

shellcode在栈溢出中的利用与优化

0x00 前言 在<Windows Shellcode学习笔记--shellcode的提取与测试>中介绍了如何对shellcode作初步优化,动态获取Windows API地址并调用,并通过程序实现自动提取机器码作为shellcode并保存到文件中. 弹框实例shellcode的bin文件已上传至github,地址如下: https://github.com/3gstudent/Shellcode-Generater/blob/master/shellcode.bin 注:shellcode.

Android内核漏洞利用技术实战:环境搭建&amp;栈溢出实战

前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是arm汇编以及环境的搭建方面.本文对我最近的实践做一个分享,其实很简单. 内核调试环境搭建 搭建平台: ubuntu 16.04 这里使用 android 模拟器来进行内核调试.首先下载内核代码 git clone https://aosp.tuna.tsinghua.edu.cn/kernel/g

栈溢出之rop到syscall

当程序开启了nx,但程序有syscall调用的时候.这时栈溢出的利用就可以通过rop来执行syscall的59号调用execve('/bin/sh',null,null),这是这次alictf一道pwn的心得. ida配合gdb定位程序漏洞如下: signed __int64 __fastcall sub_40108E(__int64 a1) { signed __int64 result; // [email protected] __int64 v2; // [email protected

WINDOWS平台下的栈溢出攻击从0到1(篇幅略长但非常值得一看)

Stack Buffer Overflow On Windows Part 11.介绍本篇文章旨在带领学习二进制安全的新手朋友在Stack Buffer Overflow在Windows上的技术实现从0到1的这个过程.笔者也希望能够通过这些技术分享帮助更多的朋友走入到二进制安全的领域中.2.文章拓扑由于本篇文章的篇幅略长,所以笔者在这里放一个文章的拓扑,让大家能够在开始阅读文章之前对整个文章的体系架构有一个宏观的了解..\01.介绍.\02.文章拓扑.\03.从栈开始.\04.ESP.EBP寄存

栈溢出笔记1.2 覆盖EIP

1.1节中我们说到可以利用栈溢出来破坏栈中原有的内容,这一节中,我们就来看看如何争夺到返回地址(EIP),使得我们可以随意控制它的值,这样我们就可以控制程序.来看一个经典的程序: 这个程序的get_print函数中定义了一个大小为11个字节的数组,正常情况下我们的输入应该最多为10个字符(还有一个\0结束符),而gets函数没有明确定义输入的大小,因此,我们可以输入超过10个字符,从而造成栈溢出.如下,输入10个'A',一切正常: 图8 当我输入11个'A'时,虽然顺利打印出来11个'A',但是

有关于二进制漏洞和利用的碎碎念

有关于二进制漏洞和利用的碎碎念 划水作品 偷闲记录一下二进制方面的各种概念,各种原理,各种利用等等,方便过后查阅,也为之后的学习路线列一个大的框架,主要内容还是针对CTF中的pwn,实际漏洞也有这些方面,不过就需要花更多的精力慢慢硬磕了. 栈溢出 由于种种原因,这是本人学习时间最长的一种漏洞,学的时候还有乌云,学完... 栈溢出原理很简单,就是栈上的数据没有合理的被控制,从而使得输入数据超出它本应该在的范围,越界少的可能只是局部变量覆盖,多的就是劫持控制流,不同情况造成不同的后果. 栈溢出是二进

路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析

这次笔者来复现一个比较经典的栈溢出漏洞:D-link dir-815 栈溢出.其实这个路由器的栈溢出漏洞的利用方式和之前 DVRF 靶机平台的栈溢出例子大同小异,只是需要注意下一些小的地方. 前言 这个栈溢出的原因是由于 cookie 的值过长导致的栈溢出.服务端取得客户端请求的 HTTP 头中 Cookie 字段中 uid 的值,格式化到栈上导致溢出. 漏洞分析 大体流程 首先还是先将 cgibin 加载到 IDA 中,定位到 sobj_get_string 函数. 在 sobj_get_st