Jump to content

Duvida!!!


Recommended Posts

Boa tarde!

nos meus estudos  descobrir algo interessante, um programa em assembly como:

global _main:

_main:
    mov eax, 10
    
    add ecx, 10
    add ebx, 20

compilando:

nasm -f win32 tes.asm -o tes.o

e usando o objdump do gcc temos o seguite resutado

tes.o:     file format pe-i386


Disassembly of section .text:

00000000 <.text>:
   0:   b8 0a 00 00 00          mov    $0xa,%eax
   5:   83 c1 0a                add    $0xa,%ecx
   8:   83 c3 14                add    $0x14,%ebx

concluimos que 83 é o opcode de add, c1 e c3 são os registradores ecx, ebx e 0a e 14 sao os valores 10 e 20 em hexadecimal.

minha duvida é tem como atrves do codigo em C, colocar esses opcodes para o precessador execultar?

Edited by Edinho Sousa
esqueci uma parte 0_0
Link to post
Share on other sites
  • Administradores

Oi @Edinho Sousa. É exatamente como se costuma testar um shellcode em C. Tudo que você precisa é:

 

1. Colocar os opcodes que você quer num buffer.

2. Criar um ponteiro de função que aponte para este buffer.

3. Chamar esta função através do ponteiro criado no passo anterior.

 

Tutoriais sobre shellcode / exploração de binários vão te mostrar isso. Achei um gist aqui: https://gist.github.com/securitytube/5318838

 

Abraço!

Link to post
Share on other sites

Infelizmente a conclusão sobre os opcodes está errada. O formato de opcodes de processadores Intel (x86) é mais complicada:

Untitled.thumb.png.365f6cdee0337c2498638885ec3336a8.png

Um opcode pode ter até 3 btyes de tamanho, e pode ser precedido de um ou mais prefixos. Seguido de mais 1 byte contendo a lista de argumentos (ModR/M - registro ou memória), seguido do byte SIB - ainda temos o displacement (offset) e um possível valor imediato.

Consulte o volume 2 do Manual de desenvolvimento de software da Intel para ver os opcodes de todas as instruções (https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html).

Link to post
Share on other sites

OUTRO problema... Simplesmente colocar os bytes dos opcodes num buffer é problemático. Sistemas modernos usam paginação para gerenciar memória e páginas podem ter o flag NX (not executable) habilitado. É o caso do segmento de dados. O programa abaixo simplesmnte causará um "segmentation fault" porque o segmento de dados não permite execução de código (mesmo que o "shellcode" esteja correto e respeite a convenção de chamada):
 

#include <stdio.h>

char *shellcode = "\x8d\x04\x7f"    // lea eax,[rdi+rdi*2]
                  "\xc3";           // ret

int main( void )
{
  int (*f)(int) = (int (*)(int))shellcode;
  int y;

  y = f(3);
  printf( "%d\n", y );
}

Compilando e executando:
 

$ cc -o test test.c
$ ./test
Segmentation fault (code dumped)

 

  • Curtir 1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...