首页
社区
课程
招聘
[求助]这是一个自制的shellcode,遇到一些问题!
发表于: 2012-6-22 10:50 4748

[求助]这是一个自制的shellcode,遇到一些问题!

2012-6-22 10:50
4748
#include <stdio.h>
#include <windows.h>

char szCode[] =
"\xC6\x45\xEF\x79\xC6\x45\xF0\x20\xC6\x45\xF1\x6D\xC6\x45\xF2\x73\xC6"
"\x45\xF3\x67\xC6\x45\xF4\x62\xC6\x45\xF5\x6F\xC6\x45\xF6\x78\xC6"
"\x45\xF7\x00\x8D\x75\xEE\xC6\x45\xF9\x62\xC6\x45\xFA\x75\xC6\x45"
"\xFB\x66\xC6\x45\xFC\x66\xC6\x45\xFD\x6C\xC6\x45\xFE\x6F\xC6\x45"
"\xFF\x00\x8D\x7D\xF9\x6A\x01\x56\x57\x6A\x00\xB8\xEA\x07\xD5\x77"
"\xFF\xD0";

int main()
{
         LoadLibrary( "user32.dll" );
__asm
{
lea eax,szCode;
push eax;
ret;
}
return 0;
}

请问:这段代码为什么执行效果是这样,而不是这样呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
因为你自制的有问题

没调整esp给自己分配空间
加上
PUSH EBP   
MOV EBP,ESP
SUB ESP,100

你少了一条指令
"my msgbox"第一条指令设置 'm'的指令没看见哦

加上 MOV BYTE PTR SS:[EBP-12],6D

char szCode[] =
"\x55\x8B\xEC\x81\xEC\x00\x01\x00\x00" "\xC6\x45\xEE\x6D"
"\xC6\x45\xEF\x79\xC6\x45\xF0\x20\xC6\x45\xF1\x6D\xC6\x45\xF2\x73\xC6"
"\x45\xF3\x67\xC6\x45\xF4\x62\xC6\x45\xF5\x6F\xC6\x45\xF6\x78\xC6"
"\x45\xF7\x00\x8D\x75\xEE\xC6\x45\xF9\x62\xC6\x45\xFA\x75\xC6\x45"
"\xFB\x66\xC6\x45\xFC\x66\xC6\x45\xFD\x6C\xC6\x45\xFE\x6F\xC6\x45"
"\xFF\x00\x8D\x7D\xF9\x6A\x01\x56\x57\x6A\x00\xB8\xEA\x07\xD5\x77"
"\xFF\xD0";

之前你没
MOV EBP,ESP
SUB ESP,100
,当时
----------------------------------
ESP
.
.这段地址空间正好很短
.
EBP
然后就设置ebp地址上面的内存,地址还超越了esp值,
-------------------------------------
...字符串都写到这里来了
ESP
.
.这段地址空间正好很短
.
EBP

-------------------
然后就是Push 1的时候ESP主动上调,并写入00000001  4字节的数据把你的字符串给覆盖了
2012-6-22 12:06
0
雪    币: 26
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
这代码会这样

#include <stdio.h>
#include <windows.h>

char szCode[] =
"\xC6\x45\xEE\x6D"
"\xC6\x45\xEF\x79\xC6\x45\xF0\x20\xC6\x45\xF1\x6D\xC6\x45\xF2\x73\xC6"
"\x45\xF3\x67\xC6\x45\xF4\x62\xC6\x45\xF5\x6F\xC6\x45\xF6\x78\xC6"
"\x45\xF7\x00\x8D\x75\xEE\xC6\x45\xF9\x62\xC6\x45\xFA\x75\xC6\x45"
"\xFB\x66\xC6\x45\xFC\x66\xC6\x45\xFD\x6C\xC6\x45\xFE\x6F\xC6\x45"
"\xFF\x00\x8D\x7D\xF9\x6A\x01\x56\x57\x6A\x00\xB8\xEA\x07\xD5\x77"
"\xFF\xD0";

int main()
{
         LoadLibrary( "user32.dll" );
__asm
{
lea eax,szCode;
push eax;
ret;
}
return 0;
}
上传的附件:
2012-6-22 12:26
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
我刚仔细看了下问题,
修改了1楼的回复了
2012-6-22 12:29
0
雪    币: 6564
活跃值: (4361)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
5
其实你后面还少几行呢,
MOV ESP,EBP
pop ebp
ret

上面有
push ebp
mov ebp,esp
下面没有恢复,也没有返回.
2012-6-22 12:33
0
雪    币: 26
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
跟你们学到不少,太谢谢了
2012-6-22 12:43
0
雪    币: 26
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
不好意思,在问一下,如何将汇编代码转成十六进制字符串呢
2012-6-22 16:52
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
其实
pushad
popad

就可以了
2012-6-24 09:29
0
雪    币: 144
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
汇编代码写在OD里,看内存。oD插件有ha_nonawrite1.2(写汇编代码的),数据格式转换。我是这样弄的,不知大牛们用什么方法
2012-6-24 12:30
0
雪    币: 6564
活跃值: (4361)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
10
先OD,然后再Shift+x就复制出来了,然后自己写个小工具每格两个字符加上一个\x.
2012-6-24 17:40
0
游客
登录 | 注册 方可回帖
返回
//