C spiegazione del codice shell

6

Ho trovato questo codice shell al link :

#include <stdio.h>
char sh[]="\xeb\x0b\x5f\x48\x31\xd2\x52\x5e\x6a\x3b\x58\x0f\x05\xe8\xf0\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
void main(int argc, char **argv)
{
    int (*func)();
    func = (int (*)()) sh;
    (int)(*func)();
}

Istruzioni:

How To Run

$ gcc -o sh_shell sh_shell.c
$ execstack -s sh_shell
$ ./sh_shell

Qualcuno può spiegare come funziona?

In che modo può danneggiare qualcosa?

A cosa serve sh ? ( "뀋_H1ҀR^j;X耰bin/sh" (unicode) o "�_H1�R^j;X�����/bin/sh" (ASCII) non ha molto senso, eccetto per gli ultimi 6 caratteri, quali sono questi caratteri in primo piano?)

    
posta Shomz 09.04.2016 - 03:41
fonte

2 risposte

8

utilizzando ndisasm , i dati nell'array sh possono essere disassemblati nel seguente codice macchina 64bit x86 valido:

00000000  EB0B              jmp short 0xd
00000002  5F                pop rdi
00000003  4831D2            xor rdx,rdx
00000006  52                push rdx
00000007  5E                pop rsi
00000008  6A3B              push byte +0x3b
0000000A  58                pop rax
0000000B  0F05              syscall
0000000D  E8F0FFFFFF        call qword 0x2
00000012                    '/bin/sh'

Sembra semplice shellcode indipendente dalla posizione per eseguire un syscall del kernel per eseguire /bin/sh .

La prima istruzione salta in avanti all'istruzione poco prima della stringa /bin/sh , che a sua volta restituisce un call alla seconda istruzione. L'indirizzo di ritorno viene quindi estratto dallo stack nel registro rdi . Questo è un trucco per ottenere l'indirizzo memeory della stringa /bin/sh , poiché lo shellcode non sa dove si trova in memoria quando viene eseguito.

Il registro rdx viene quindi impostato su 0 e inviato allo stack e reinserito nel registro rsi . Il byte 0x3b viene quindi pusato nello stack e restituito al registro rax .

Ora siamo configurati come segue:

  • rdi = puntatore alla stringa /bin/sh
  • rdx = 0
  • rsi = 0
  • rax = 0x3b

A questo punto, passiamo il controllo al kernel con syscall , dove l'argomento 0x3b in rax indica a execve () il percorso del file che è al puntatore rdi

Se lo traduciamo in C, in pratica funziona:

execve('/bin/sh', NULL, NULL);
    
risposta data 09.04.2016 - 10:46
fonte
-1

Sapere esattamente cosa fa questo codice richiede conoscere il sistema operativo e il processore per la piattaforma. La variabile sh contiene istruzioni esadecimali per il processore e questo contenuto della variabile non viene compilato dal compilatore. Le tre linee in main () sono usate per chiamare la variabile sh come puntatore a funzione. Il contenuto di sh contiene istruzioni per l'esecuzione di una chiamata di sistema a Linux. Probabilmente questo codice dà l'accesso all'attaccante alla shell SH.

A me sembra che questo codice C sia l'inizio di un exploit di code-injection. Si potrebbe progettare il codice da iniettare testandolo come un programma C come questo. Quindi, per implementare il codice di iniezione, l'autore dell'attacco deve semplicemente avere accesso a un buffer che trabocca e deve copiare e incollare qualcosa come questo codice nella porzione di overflow del buffer. Questo tipo di attacco è chiamato sovraccarico del buffer. La shell SH in questo exploit verrebbe eseguita con le stesse autorizzazioni del programma con il sovraccarico del buffer sfruttato.

    
risposta data 09.04.2016 - 04:29
fonte

Leggi altre domande sui tag