Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Belial & Grimoire en 1 Septiembre 2013, 22:23 pm



Título: problema con una violacion de segmento usando opcodes
Publicado por: Belial & Grimoire en 1 Septiembre 2013, 22:23 pm
Hola

Estaba haciendo un ejemplo de como usar los opcodes para ejecutarlos en un C, por ejemplo

Este codigo es el clasico en esamblador de exit(0), y usando objdump quedo asi

Código
  1. #include <stdio.h>
  2.  
  3. char exits[] = "\xbb\x14\x00\x00\x00"
  4.                   "\xb8\x01\x00\x00\x00"
  5.                   "\xcd\x80";
  6.  
  7. int main(){
  8.  
  9.    int *ret;
  10.    ret = (int *)&ret +2;
  11.    (*ret) = (int)exits;
  12. }

el programa lo compilo de esta forma ya que lo estoy analizando como 32 bits y mi sistema es de 64bits

gcc -m32 -ggdb -mpreferred-stack-boundary=2 -o salida salida.c

pero cuando lo ejecuto me sale una violacion de segmento, me imagino que falla exit(0) y no sale correctamente el programa

Alguien me podria decir porque falla el codigo?



Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Stakewinner00 en 1 Septiembre 2013, 23:01 pm
es raro por que lo compile sin querer usando
Código:
g++ main.cpp
y una vez compilado abri el programa y no hubo error, luego como tu lo compilaste si, supongo que es el compilador

luego probe y me da error si pongo
Código:
-mpreferred-stack-boundary=
para que sirve esa opción? con los valores 2 y 3 me da error pero con el 4 ya no...


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Belial & Grimoire en 1 Septiembre 2013, 23:39 pm
Es para alinear el stack

Citar
-mpreferred-stack-boundary

lo que no entiendo, es porque el codigo en ensamblador que compile en 32 bits si funciona cuando lo ejecuto, pero el archivo en C hay una violacion de segmento, solo como tu dices, si lo compilo de forma normal, no sale ningun error, pero acaba compilado como 64 bits, con opcodes de 32 bits




Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Eternal Idol en 2 Septiembre 2013, 00:03 am
Supongo que la clave es que exits esta en una sección de datos y no en una de codigo, al menos en Windows muere ahi al depurarlo...


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Belial & Grimoire en 2 Septiembre 2013, 00:21 am
cierto, ya lo movi a la sección de código y se ejecuto bien... ya funciona, gracias

solo una ultima pregunta, en el archivo asm puse a ebx con 20, no es necesario pero es de practica

mov ebx, 20
mov eax, 1
int 0x80

cuando lo ejecuto, funciona bien y obtengo el registro de ebx

[linux]$echo $?
20

pero con el archivo hecho en C, me aparece un numero aleatorio

[linux]$echo $?
28
[linux]$echo $?
146
[linux]$echo $?
44

es normal?

salu2


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Eternal Idol en 2 Septiembre 2013, 01:11 am
De nadas, no se, fijate si depuras el programa y ejecuta exactamente el codigo correcto, de ser asi no tengo ni idea ...


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: cpu2 en 2 Septiembre 2013, 03:14 am
lo que no entiendo, es porque el codigo en ensamblador que compile en 32 bits si funciona cuando lo ejecuto, pero el archivo en C hay una violacion de segmento, solo como tu dices, si lo compilo de forma normal, no sale ningun error, pero acaba compilado como 64 bits, con opcodes de 32 bits

Si intentas ejecutar la interrupcion al vector 0x80 en un sistema de 64 bits, tendras problemas tienes que usar la instruccion syscall, es mas rapida que la interrupcion al vector asi que no se porque estas en 32 bits.

Te dejo un codigo, devuelve el valor correcto y esta mucho mas optimizado, ya que solo me limito a saltar a la direccion de la shellcode, y esa misma es menos pesada pero no mas rapida.

Código
  1. char shell[] = "\x6a\x01\x58\x6a\x14\x5b\xcd\x80";
  2.  
  3. int main () {
  4.  
  5. asm ("jmp shell");
  6.  
  7. }

Compilado sin ninguna opcion.

Un saludo.


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Belial & Grimoire en 2 Septiembre 2013, 04:08 am
gracias cpu2, tendre en cuenta el codigo que me diste... y tienes razon por lo de 64 bits, por eso tenia la duda de hacerlo funcionar como 32 bits para evitar esos problemas  ;D

y lo otro si era normal, habia olvidado desactivar randomize del kernel  :silbar:

Tambien hay que quitar la proteccion de stack

-fno-stack-protector -z execstack

Y con eso, ya funciona con char en los datos

Código
  1. char exits[] = "\xbb\x14\x00\x00\x00"
  2.                   "\xb8\x01\x00\x00\x00"
  3.                   "\xcd\x80";
  4.  
  5. int main()

salu2


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Eternal Idol en 2 Septiembre 2013, 09:33 am
¿Eso quiere decir que los programas de 32 bits tienen que ser recompilados? En Windows hay una emulacion que da soporte al codigo legacy :silbar:


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: cpu2 en 2 Septiembre 2013, 10:39 am
No, si tu sistema es multilibreria te permite ejecutar binarios de x86 en una amd64. Me acuerdo cuando utilizaba Gentoo en la instalacion te daba ha escojer un perfil si lo querias multilibreria o un amd64 puro, es decir nada de emulacion de binarios x86 y como ejecutes una interrupcion al vector 0x80 un core dumped.

Pero no se ya hace tiempo que no toco Linux, solo Backtrack. Pero es lo que me sucede con OpenBSD ya que es un sistema de 64 bits puro, es por eso que le dije lo de la interrupcion al vector 0x80.

Un saludo.


Título: Re: problema con una violacion de segmento usando opcodes
Publicado por: Eternal Idol en 2 Septiembre 2013, 11:02 am
Ah, debe tener habilitado el soporte para 32 bits entonces.