能力值:
( 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执行能返回,这样,调试都根本想不到中间执行了什么,不过我因为我中间执行的是一个信息框,所以才会被你发现~
|
能力值:
( 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了。
|
能力值:
( LV12,RANK:360 )
|
-
-
4 楼
终于有个认真看的了,不错..我后面补充的那个方法,就是执行完我自己的代码后,继续回到原来的位置..当然这是在MASM里面实现的
|
能力值:
( LV8,RANK:120 )
|
-
-
5 楼
学习了 :)
|
能力值:
( LV11,RANK:190 )
|
-
-
6 楼
膜拜,其实我看不懂
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
收藏下,哈哈
|
能力值:
( 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");
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
果然灰常有创意.有意思啊
|
能力值:
( LV3,RANK:30 )
|
-
-
10 楼
看了楼主的帖子,得到一个新启发,可以依靠修改函数的返回地址构造自己的shellcode进行干坏事!
|
能力值:
( LV12,RANK:250 )
|
-
-
11 楼
不错哦!

|
能力值:
( LV3,RANK:30 )
|
-
-
12 楼
本质就是format string 漏洞的利用方式
|
能力值:
( 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; }
|
能力值:
( LV5,RANK:70 )
|
-
-
14 楼
LS的用参数来获取Ret地址比较通用, 
你们都太会玩了,玩的也太邪恶了 
看来是我太单纯
|
能力值:
( LV12,RANK:360 )
|
-
-
15 楼
不知道你指的是不是溢出?
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
还真挺有意思的~哈哈
|
能力值:
( LV3,RANK:30 )
|
-
-
17 楼
你必须有预先修改目标地址和源地址机会, 这和溢出原理是一样的, 可利用的地方基本没有
|
能力值:
( LV5,RANK:70 )
|
-
-
18 楼
编译开启 /GS,修改返回地址还能这么玩么?
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
可以干坏事!
|
|
|