Funciona no Linux ???

1. Funciona no Linux ???

???
gokernel

(usa Linux Mint)

Enviado em 05/02/2013 - 16:33h


Olá pessoal !!!

Estou desenvolvendo uma pequena API que escreve funcoes nativas (x86) em uma array e entao executa esta como uma funcao normal...

no windows esta funcionando normalmente mas no Linux MINT 12 quebra, alguem poderia testar( compilar e rodar ) e por gentileza informar ???

o codigo:
http://codepad.org/oSmTbzIi


aqui no windows funciona normal ... essa eh a minha base do "compilador".

DETALHE:
este programa dar um loop de 30 vezes ( 70 ... 100 )

Grato !!!



  


2. Re: Funciona no Linux ???

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/02/2013 - 17:03h

"Quebra" de que forma?

No tópico em que você começou a falar sobre shellcode, eu disse que no Linux é gerado erro quando se tenta executar código em um segmento que não esteja marcado como read-only. Corrijo-me em relação ao que disse antes apenas porque tal marcação é por página, em lugar de segmento. A essência, porém, permanece: a proteção W^X (um símbolo de que as páginas não podem ser Writable e eXecutable ao mesmo tempo) o impedirá de você fazer esse seu prograa funcionar de modo trivial.

É impossível fazer? Certamente não, e a carga de bibliotecas dinâmicas mostra que se pode escrever numa região de memória e depois executar código que está nela -- provavelmente depois de marcar as páginas que acomodaram a aquele código como não mais escrevíveis. Veja a documentação de mmap() e mprotect().

Alternativamente, você pode tentar desligar o W^X nas configurações do BIOS. Só que eu não recomendo fazer isso.


3. Re: Funciona no Linux ???

???
gokernel

(usa Linux Mint)

Enviado em 05/02/2013 - 17:42h

ola "paulo" !

o programa quebra ( segment fault ) ao tentar executar a linha 222 do codigo que postei.

se nao executar essa linha o programa funciona normalmente e lógico nao executa o ShellCode.


4. Re: Funciona no Linux ???

???
gokernel

(usa Linux Mint)

Enviado em 05/02/2013 - 19:13h


Finalmente funcionou no Linux, mas tive que trocar de tipo (unsigned char * > char * ):

http://codepad.org/I8ayLKja

DETALHE:
Depois que consegui executar com sucesso no Linux nao fiquei tao empolgado/vibrante como consegui no Windows ;).




5. Re: Funciona no Linux ???

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/02/2013 - 09:07h

Olhando só o código (e um tanto superficialemnte), não vejo razão óbvia para você ter tido de trocar o tipo dos elementos do array code de unsigned char para char. Fiquei imaginando motivos para tanto, mas não consegui tecer uma explicação suficiente. Segundo a ABI da Intel, um char tem sinal por default (i.e. é funcionalmente equivalente a signed char), a não ser que você tenha alguma opção de compilação que altere esse default. Que compilador você usou no Windows, e qual no Linux (gcc?)? Pode dar mais detalhes do caso?

Como eu previ no outro tópico em que você tratou de assunto parecido, seu programa não compilou numa máquina de 64 bits (arquitetura amd64) por causa da sua insistência em misturar ponteiros e inteiros -- aliás, o problema se agravou quando você moudou o tipo do inteiro de long para int. Não compreendi a razão por que você não quis trabalhar com void* para representar ponteiros; por mais que em linguagem de máquina não haja distinção entre as representações de números e de endereços, o C e o C++ vêm evoluindo no sentido de deixar tal distinção sempre mais clara, em benefício de evitar acidentes no código fonte, embora não haja prejuízo do código compilado.


6. Re: Funciona no Linux ???

???
gokernel

(usa Linux Mint)

Enviado em 07/02/2013 - 18:11h

olá "paulo" !

no window e linux utilizei o GCC 32 bits.

e hospedie a Micro Assembler aqui:
http://code.google.com/p/microasm/downloads/list

ja estou utilizando a MA com sucesso no meu outro projeto ( CS: Compiled Script ) com sintax c-like.

ela esta bem mais estruturada ,amanhã atualizarei pois hoje estou super cansado ...



7. Re: Funciona no Linux ???

???
gokernel

(usa Linux Mint)

Enviado em 08/02/2013 - 10:32h

olá "paulo" !

a funcao ( gen_jg ) nao funciona em 64 bits ....

se quiser/puder ajudar:

compile este codigo em 64 bits:



int a, b;

void test (void)
{
if (a < 1000) { b = 10; }
}

int main()
{
test ();
return 0;
}



e utilize o OBJDUMP assim:
objdump -d programa > saida.txt

e por gentileza postar o codigo da funcao (test).

OBS: nao tenho como testar em 64 bits, se vc ajudar com essa pequena ajuda tentarei fazer com 32/64 bits a MA (Micro Assembler).








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts