首页
社区
课程
招聘
[分享][第一阶段 第一题]ExploitMe.exe源代码
发表于: 2010-10-21 08:12 9497

[分享][第一阶段 第一题]ExploitMe.exe源代码

2010-10-21 08:12
9497
#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;
}

[课程]Linux pwn 探索篇!

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

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

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