首页
社区
课程
招聘
[原创]shellcode xor编码/解码
发表于: 2012-5-24 17:54 12677

[原创]shellcode xor编码/解码

2012-5-24 17:54
12677

shellcode的初级变形的一点点学习,大部分搜集、翻译,少量原创,姑且算原创吧,

01 病毒上重定位问题
02 shellcode解码
03 一个unix例子
04 源码解读
05 参考

shellcode xor编码/解码器是一种较为初级的shellcode变形的方法,当然它从中采用的方法跟病毒上的方法有些类似

01 病毒上重定位问题
病毒上的解决重定位的方法,可以方便的用到shellcode的设计中。
下面部分摘自hume的<<病毒编程技术>>
在病毒技术上至少有两种方法可以解决重定位的问题:
A)第一种方法就是利用上述PE文件重定位表项的特殊作用构造相应的重定位表项。
在感染目标PE文件时,将引用自身数据的需要被重定位的地址全部写入目标PE文件的重定位表中,如果目标PE无任何重定位表项(如用MS linker的/fixed)则创建重定位表节并插入新的重定位项;
若已经存在重定位表项,则在修改已存在的重定位表节,在其中插入包含了这些地址的新表项。重定位的工作就完全由系统加载器在加载PE文件的时候自动进行了。重定位表项由PE文件头的DataDirectory数据中的第6个成员IMAGE_DIRECTORY_ENTRY_BASERELOC指向。
该方法需要的代码稍多,实现起来也相对比较复杂,另外如果目标文件无重定位表项(为了减小代码体积,这种情况也不少见),处理起来就比较麻烦,只有用高级语言编写病毒才常用该种方法,在一般的PE病毒中很少使用。
B)利用Intel X86体系结构的特殊指令,call或fnstenv等指令动态获取当前指令的运行时地址,利用自定位计算该地址与编译时预定义地址的差值(被称为delta offset),再将该差值加到原编译时预定的地址上,得到的就是运行时数据的正确地址。对于intel x86指令集而言,在书写代码时,通过将delta offset放在某个寄存器中,然后通过变址寻址引用数据就可以解决引用数据重定位的难题。还以上例说明,假如上述指令块被操作系统映射在0x500000处那么代码及其在内存中的地址将变为:

501000: 
mov eax,dword ptr [402035] 
......
502035:
db "hello world!",0
;ebp包含了delta offset值
401000: 
mov eax,dword ptr [ebp+0x402035]
......
402035:
db "hello world!",0
call delta
delta:
pop ebp
sub ebp,offset delta
delta offset:

fpu_addr:
fnop
call GetPhAddr
sub ebp,fpu_addr

GetPhAddr:
sub esp,16
fnstenv [esp-12]
pop ebp
add esp,12
ret
[BITS 32]

global _start

_start:

fabs ;fabs指令
fnstenv [esp] ;保存环境,该结构偏移12字节处就是最后执行的浮点指令的运行时地址
pop edx
pop edx
pop edx
pop edx ;此处将fabs指令的运行时地址传给edx
sub dl, -25 ; offset from fabs -> xor buffer    edx = edx + 25,25的大小指的是从shllcode到fabs的偏移

short_xor_beg:
xor ecx,ecx ;清零ecx
sub cx, -0x15F ;size of xor'd payload 设置ecx大小为0x15F

short_xor_xor:
xor byte [edx], 0x99 ; the byte to xor with ;开始循环解码
inc edx
loop short_xor_xor

shellcode:
db ...........................
global _start

_start:
jmp short getdata     ; Get data pointer 跳转到getdata
begin:

pop ebx ; Pop the data address ;弹出codestart的地址,call begin时会压入eip地址
xor ecx,ecx     ; Set up loop counter ;清零ecx
sub cx, -0x15F ; size of data payload ;设置ecx为0x15F

decode:
xor byte [ebx], 0x99     ; XOR ;开始循环解码
inc ebx     ; Increment data address
loop decode     ; Loop back to decode if cx > 0
jmp short codestart     ; Jump into decoded code


getdata:
call begin     ; Push the address of data in stack and jump
; to label begin

codestart: ; This is where the XOR'ed shellcode begins
db ..........................
;
; hello.asm -- simple non-optimized Linux/x86 shellcode
; Compile: nasm -f bin -o hello.s hello.asm
;

[BITS 32]

global _start

_start:
jmp short data ; Jump to our data section
begin:
mov eax, 4 ; syscall #4 = write()
mov ebx, 1 ; stdout
pop ecx ; Pop the data address in ecx
mov edx, 15 ; 15 bytes of data
int 0x80
mov eax, 1 ; syscall #1 = exit()
mov ebx, 0 ; status = 0
int 0x80

data:
call begin ; Call will return our data address
db "Hello, hacker!", 0x0a
$ hexdump hello.s 
0000000 1eeb 04b8 0000 bb00 0001 0000 ba59 000f
0000010 0000 80cd 01b8 0000 bb00 0000 0000 80cd
0000020 dde8 ffff 48ff 6c65 6f6c 202c 6168 6b63
0000030 7265 0a21 
0000034

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

收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
友情帮顶。。。。。。。。。。。。。。。。。。
2012-5-24 18:34
0
雪    币: 49
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
前排占楼  。。
2012-5-26 22:13
0
雪    币: 139
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有一部分是win32汇编吧
2012-5-29 10:39
0
游客
登录 | 注册 方可回帖
返回
//