首页
论坛
课程
招聘
[调试逆向] [分享][第一阶段 第一题]ExploitMe.exe源代码
2010-10-21 08:12 7882

[调试逆向] [分享][第一阶段 第一题]ExploitMe.exe源代码

2010-10-21 08:12
7882
#include <windows.h>

typedef int (WINAPI *FnMessageBoxA)(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType);
typedef int (WINAPI *FnMessageBoxW)(HWND hWnd , LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

FnMessageBoxW        pfnMessageBoxW;
FnMessageBoxA        pfnMessageBoxA;

class A
{
public:
    virtual void fn()
    {
        Sleep(1);
    }

    char data[128];
};

class B
{
public:
    virtual void fn()
    {
        pfnMessageBoxW(NULL, L"Fail", L"ExploitMe", MB_OK);
    }

    char data[128];
};

int ExploitMe()
{
    volatile int         nResult = 0;
    HANDLE               hHeap;
    HANDLE               hFile;
    DWORD                NumberOfBytesRead = 0;
    A                    a;
    B                    b;
    char                 buf[512];
    LPVOID               pHeapBuf;

    hHeap = HeapCreate(0, 0x1000, 0x10000);
    pHeapBuf = HeapAlloc(hHeap, 0, sizeof(buf));
    hFile = CreateFile("exploit.dat", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (INVALID_HANDLE_VALUE != hFile)
    {
        DWORD dwFileSize = GetFileSize(hFile, NULL);
        if (dwFileSize <= sizeof(buf))
        {
            ReadFile(hFile, buf, dwFileSize, &NumberOfBytesRead, NULL);
            memcpy(pHeapBuf, buf, dwFileSize);
            ZeroMemory(buf, sizeof(buf));
            
            HMODULE hMod = LoadLibrary("user32.dll");
            pfnMessageBoxW = (FnMessageBoxW)GetProcAddress(hMod, "MessageBoxW");
            pfnMessageBoxA = (FnMessageBoxA)GetProcAddress(hMod, "MessageBoxA");

            if (dwFileSize <= sizeof(a))
                memcpy(&a.data, pHeapBuf, dwFileSize);
            HeapFree(hHeap, HEAP_NO_SERIALIZE, pHeapBuf);
            ZeroMemory(pHeapBuf, sizeof(a.data));

            if (dwFileSize <= sizeof(b))
                memcpy(&b.data, pHeapBuf, dwFileSize);

            A* pa = &a;
            B* pb = &b;
            pa->fn();
            pb->fn();
        }
        nResult = 1;
    }

    if (hFile)
        CloseHandle(hFile);
    if (pHeapBuf)
        HeapFree(hHeap, HEAP_NO_SERIALIZE, pHeapBuf);
    if (hHeap)
        HeapDestroy(hHeap);

    return nResult;
}

int main(int argc, char* argv[])
{
    if (ExploitMe())
        return 0;
    else
        return -1;
}

《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 204
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
龙在江湖 活跃值 2010-10-21 08:55
2
0
学习.....
雪    币: 1901
活跃值: 活跃值 (84)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
tjszlqq 活跃值 1 2010-10-21 09:21
3
0
强大啊,这么快逆出源码了。
雪    币: 203
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
钢仔 活跃值 2010-10-21 09:50
4
0
very good,学习了
雪    币: 285
活跃值: 活跃值 (86)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 活跃值 14 2010-10-21 09:51
5
0
想不明白为什么   memcpy(&a.data, pHeapBuf, dwFileSize);  这个不会溢出。。
也是就掉sleep不溢出  而调用后面那个MessageBox的时候却可以
谁来解释下啊。。。
雪    币: 89
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zphdebug 活跃值 1 2010-10-21 09:56
6
0
太强悍了。。。
雪    币: 2273
活跃值: 活跃值 (17)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 活跃值 7 2010-10-21 10:04
7
0
和栈中的变量的布局有关,实际上都溢出的,A.data 溢出覆盖了B中的函数地址,B.data 溢出覆盖了buf[512]
雪    币: 285
活跃值: 活跃值 (86)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 活跃值 14 2010-10-21 10:37
8
0
[QUOTE=北极狐狸;875677]和栈中的变量的布局有关,实际上都溢出的,A.data 溢出覆盖了B中的函数地址,B.data 溢出覆盖了buf[512][/QUOTE]

谢谢 北极狐狸。明白了。
利用了堆栈数据覆盖。  刚好把那个地址给覆盖了。
雪    币: 129
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪yaojun 活跃值 2010-10-21 10:44
9
0
前排学习。。。。很强大。
雪    币: 2857
活跃值: 活跃值 (362)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2010-10-21 10:54
10
0
逆得太好了...
雪    币: 1624
活跃值: 活跃值 (60)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
EvilKnight 活跃值 4 2010-10-21 11:20
11
0
不错不错,代码风格,变量命名都不错!
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Prochg 活跃值 2010-10-21 15:30
12
0
。。IDA F5一下就这样了。。。
雪    币: 666
活跃值: 活跃值 (26)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 活跃值 7 2010-10-22 02:29
13
0
就是故意通过变量的布局创造这样一个环境。用类函数的形式也是特意的,从稳定性的角度上说,call [edx]如果变成call edx就少了一层难度了。
雪    币: 466
活跃值: 活跃值 (147)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2010-10-22 09:35
14
0
竟然能逆成类风格,学习了
雪    币: 23
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
梵听 活跃值 1 2010-10-23 23:29
15
0
膜拜代码。。。。
我什么时候才能完全译成C++  
雪    币: 13
活跃值: 活跃值 (75)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
叁毛 活跃值 1 2010-10-24 15:59
16
0
是的,我之前在公司看了下,那时候没想过类的。  
这点我觉得他功底非常深厚。
雪    币: 23
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
梵听 活跃值 1 2010-10-25 14:47
17
0
http://www.cybertech.net/~sh0ksh0k/projects/unixheap99/heaptut-chinese.txt

刚刚好看到一个与此题目有关的分析……
转过来……
雪    币: 21
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
柳逸安 活跃值 2010-11-21 21:51
18
0
太强了,一定要膜拜下
雪    币: 29
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
webwizard 活跃值 2010-11-24 06:03
19
0
膜拜加学习。
游客
登录 | 注册 方可回帖
返回