首页
社区
课程
招聘
[原创]exploit_me_A的shellcode构造与突破
发表于: 2008-1-2 13:23 6411

[原创]exploit_me_A的shellcode构造与突破

2008-1-2 13:23
6411

这次exploit_me本来很感兴趣的,可是好像日子选太好了啊 ,都是聚会,结果B就没有去做了,A也就没必要提交了,偶的书啊。

      其实我对shellcode并没有什么研究,也就马马虎虎跟过一个ani漏洞的shellcode,就一点皮毛,讲的不对,还望多多指正。

      先来看看exploit_me_A溢出发生的函数

@exploit__00401000:                          ;<= Procedure Start

        sub     esp, 0C8h
        or      ecx, 0FFFFFFFFh
        xor     eax, eax
        lea     edx, dword ptr [esp]
        push    esi
        push    edi
        mov     edi, dword ptr [esp+0D4h]
        push    040904Ch         ; ASCII "********************"
            
; 源字符串计数,不能含有null字符,否则即被截断
        repne   scas byte ptr es:[edi]       ; edi=pszRecv 
        not     ecx                          ; nRecvLen
        sub     edi, ecx                    
        mov     eax, ecx
        mov     esi, edi
        mov     edi, edx
        shr     ecx, 2
        rep     movs dword ptr es:[edi], dword ptr [esi]
        mov     ecx, eax
        and     ecx, 3
        rep     movs byte ptr es:[edi], byte ptr [esi]
        ……
int exploit__00401000(const char* pszRecv)
{
	char szRecv[200];
	strcpy(szRecv,pszRecv);
……
}
int exploit__00401000(const char* pszRecv)
{
	char szRecv[200];
	strcpy(szRecv,pszRecv);
……
}
Esp-> return Address
          pszRevc
          ……

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 8
支持
分享
最新回复 (12)
雪    币: 926
活跃值: (407)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
2
可以确定shellcode的条件:
shellcode必须大于200字节,且不能含null字符

其他没看  只看到LZ这句 就觉得不对.  因为至少我那个SHELLCODE是小于200字节  并且成功溢出了的
2008-1-2 13:33
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
哈,学习学习
2008-1-2 13:37
0
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
不管用bbs还是bbs1,总是断断续续不能访问,多发了一个,删另一个吧
2008-1-2 13:39
0
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
还要请教怎么小于200溢出
2008-1-2 13:40
0
雪    币: 926
活跃值: (407)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
6
太有意思了   forgot那里写的是 一定要小于200字节  你这里却相反
2008-1-2 13:45
0
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
谢谢提醒   我说错了 是大于200字节才能溢出

无语了
2008-1-2 13:52
0
雪    币: 11394
活跃值: (3391)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
8
shellcode 指的是具有执行功能的 指令的16进制代码

你所说的大于200字节应该是你构造的恶意字符串的长度,它里面包括shellcode

要想使跨平台 那么恶意串必须小于200字节

因为
要跨平台 就用程序本身的地址就可以了 程序本身地址有00 ,会截断串所以 只能做到把返回地址覆盖,后面的就写不到程序里去了

这样shellcode 模式要转变下
方式为SHELLCODE+JUMPADDR
shellcode控制在196字节内完全够了 后面3字节写跳转指令地址 因为程序本身地址如00402364 ,堆栈要覆盖的地址有00,只需要把402364写进去,如果有40了只需要把23,64写进去就可以了.

其实我们可以发现,返回地址下面就是我们shellcode在栈里的地址,所以我们用retn指令地址覆盖,就条到我们shellcode里了.

failwest给的168字节 完全符合
2008-1-2 13:53
0
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
作为一个poc 200字节当然是够了  

但是你想做点什么时。。。
2008-1-2 14:00
0
雪    币: 11394
活跃值: (3391)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
10
对啊,portbind的 一般都300多字节,
那样只能选择系统地址跳转了 方式为jumpaddr+shellcode
系统的跳转地址具有不通用性
2008-1-2 14:07
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
11
腰好没烦恼,你要做点什么就再recv一个包,只要tcp不分片
2008-1-2 14:56
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
12
好,这个写的巧:
        memset((char*)szBuffer,0x90,204);
        memcpy((char*)szBuffer,(char*)shellcode,103);
        *(DWORD*)(&szBuffer[200])=0x4010A4;
2008-1-2 15:27
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
13
其实,关于溢出这部分可以做的更活些,ret地址你说了算,要怎么跳便怎么跳。
2008-1-2 15:29
0
游客
登录 | 注册 方可回帖
返回
//