首页
社区
课程
招聘
[原创]利用传值API修改返回地址到指定代码处执行
发表于: 2011-6-28 10:42 11138

[原创]利用传值API修改返回地址到指定代码处执行

2011-6-28 10:42
11138

刚在看一个拥有传值的API时(什么是传值?就是API参数有__out属性的),想到这么一个猥琐的方法,也真的实现了,觉得蛮新奇蛮好玩的,分享给大家,代码如下:

.386
.model flat, stdcall
option casemap :none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
.data
fmt    db "%s",0
msgtxt db "我怎么被执行了?",0
.code
New_OEP:
invoke MessageBox,0,addr msgtxt,0,0
invoke ExitProcess,0
start proc
local @temp
mov    @temp,New_OEP
lea    ecx,[esp-3*4-4]
invoke wsprintf,ecx,addr fmt,addr @temp

start endp
end start

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 656
活跃值: (458)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
2

.code
New_OEP:
invoke MessageBox,0,addr msgtxt,0,0
jmp _Retn-3
start proc
local @temp
mov	@temp,New_OEP
lea	ecx,[esp-3*4-4]
invoke wsprintf,ecx,addr fmt,addr @temp
_Retn::
ret
start endp



如果你改这样,wsprintf执行能返回,这样,调试都根本想不到中间执行了什么,不过我因为我中间执行的是一个信息框,所以才会被你发现~
上传的附件:
2011-6-28 11:22
0
雪    币: 191
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
LZ真恶搞,主要是修改函数调用的Ret地址跳转到指定地址执行,要是这样那方法应该也会超多的。
也画个瓢
void __cdecl MyTest(int a, int b, int c)
{
    printf("This is my test!\r\n");
}

int _tmain(int argc, _TCHAR* argv[])
{    
    DWORD dwAddr = (DWORD)(LPDWORD)MyTest;
    LPDWORD lpMemcpyRetAddr = NULL;
    _asm
    {
        xor eax, eax
        lea eax, [esp - 3*4 - 4]  //3*4是3个参数占的栈空间 -4 是返回地址的栈空间
        mov lpMemcpyRetAddr , eax  //保存memcpy返回的地址,也就是memcpy后面第一条汇编执行地址
    }
    memcpy(lpMemcpyRetAddr , &dwAddr, sizeof(DWORD));


不过返回时程序流程就被修改了,要是能再顺序执行就会比较h了。
2011-6-28 12:52
0
雪    币: 656
活跃值: (458)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
4
终于有个认真看的了,不错..我后面补充的那个方法,就是执行完我自己的代码后,继续回到原来的位置..当然这是在MASM里面实现的
2011-6-28 15:45
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
学习了 :)
2011-6-28 16:15
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
6
膜拜,其实我看不懂
2011-6-28 16:19
0
雪    币: 160
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
收藏下,哈哈
2011-6-28 18:46
0
雪    币: 191
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
返回地址补充下,不过感觉怪怪的。

DWORD g_dwRetEip = 0;

__declspec(naked) void __stdcall MyTest(int a, int b, int c = 3*4)
{
    DWORD dwWrite;
    printf("This is my test!\r\n");
    _asm
    {
        lea eax, [esp + 2*4 ]   //地址具体见图
        mov dwWrite, eax
    }
    WriteProcessMemory(GetCurrentProcess(), (DWORD*)dwWrite, &g_dwRetEip, sizeof(DWORD), &dwWrite);    
    _asm
    {
        lea esp, [esp + 2*4]   //地址具体见图
        ret                 
    }
}

int _tmain(int argc, _TCHAR* argv[])
{   
    _asm
    {
        call HOUHOU
HOUHOU:
        pop eax
        sub eax, HOUHOU
        add eax, RET_HERE
        mov g_dwRetEip, eax
    }
    DWORD dwAddr = (DWORD)(LPDWORD)MyTest;
    LPDWORD myRet = NULL;
    _asm
    {
        xor eax, eax
        lea eax, [esp - 3*4 - 4]   //地址具体见图
        mov myRet, eax
    }
    memcpy(myRet, &dwAddr, sizeof(DWORD));

RET_HERE:    
    printf("just test!\r\n");

上传的附件:
2011-6-28 20:05
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
果然灰常有创意.有意思啊
2011-6-29 05:59
0
雪    币: 0
活跃值: (984)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
看了楼主的帖子,得到一个新启发,可以依靠修改函数的返回地址构造自己的shellcode进行干坏事!
2011-6-29 08:56
0
雪    币: 305
活跃值: (36)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
11
不错哦!
2011-6-29 09:50
0
雪    币: 400
活跃值: (1524)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
本质就是format string 漏洞的利用方式
2011-6-29 10:43
0
雪    币: 952
活跃值: (2151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我也来贴一个类似的...

#pragma optimize("", off)

DWORD g_dwRetEip = 0;
__declspec(naked) void MyTest()
{
printf("This is %s\n", __FUNCTION__);
__asm
{
jmp g_dwRetEip
}
}

void Test(DWORD dwV) // 必须存在一个以上参数用来获取返回地址
{
PDWORD pdwEsp = &dwV;
g_dwRetEip = *(pdwEsp - 1);
*(pdwEsp - 1) = (DWORD)MyTest;
}

#pragma optimize("", on)

int _tmain(int argc, _TCHAR* argv[])
{
Test(0);
return 0;
}
2011-6-29 11:17
0
雪    币: 191
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
LS的用参数来获取Ret地址比较通用,
你们都太会玩了,玩的也太邪恶了
看来是我太单纯
2011-6-29 12:18
0
雪    币: 656
活跃值: (458)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
15
不知道你指的是不是溢出?
2011-6-29 14:35
0
雪    币: 68
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
还真挺有意思的~哈哈
2011-6-30 02:29
0
雪    币: 334
活跃值: (93)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
你必须有预先修改目标地址和源地址机会, 这和溢出原理是一样的, 可利用的地方基本没有
2011-6-30 10:25
0
雪    币: 367
活跃值: (35)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
编译开启 /GS,修改返回地址还能这么玩么?
2011-11-23 12:02
0
雪    币: 19
活跃值: (1111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
可以干坏事!
2011-11-23 12:35
0
游客
登录 | 注册 方可回帖
返回