Autor
|
Tema: problema con una violacion de segmento usando opcodes (Leído 7,419 veces)
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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 #include <stdio.h> char exits[] = "\xbb\x14\x00\x00\x00" "\xb8\x01\x00\x00\x00" "\xcd\x80"; int main(){ int *ret; ret = (int *)&ret +2; (*ret) = (int)exits; }
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?
|
|
|
En línea
|
.
|
|
|
Stakewinner00
|
es raro por que lo compile sin querer usando 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 -mpreferred-stack-boundary= para que sirve esa opción? con los valores 2 y 3 me da error pero con el 4 ya no...
|
|
« Última modificación: 1 Septiembre 2013, 23:04 pm por Stakewinner00 »
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
Es para alinear el stack -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
|
|
|
En línea
|
.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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...
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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
|
|
|
En línea
|
.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nadas, no se, fijate si depuras el programa y ejecuta exactamente el codigo correcto, de ser asi no tengo ni idea ...
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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. char shell[] = "\x6a\x01\x58\x6a\x14\x5b\xcd\x80"; int main () { asm ("jmp shell"); }
Compilado sin ninguna opcion. Un saludo.
|
|
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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 y lo otro si era normal, habia olvidado desactivar randomize del kernel Tambien hay que quitar la proteccion de stack -fno-stack-protector -z execstack Y con eso, ya funciona con char en los datos char exits[] = "\xbb\x14\x00\x00\x00" "\xb8\x01\x00\x00\x00" "\xcd\x80"; int main()
salu2
|
|
« Última modificación: 2 Septiembre 2013, 04:26 am por Belial & Grimoire »
|
En línea
|
.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
¿Eso quiere decir que los programas de 32 bits tienen que ser recompilados? En Windows hay una emulacion que da soporte al codigo legacy
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con violación de segmento
« 1 2 »
Programación C/C++
|
Triper0
|
17
|
17,137
|
8 Noviembre 2015, 21:34 pm
por alesurf1989
|
|
|
calculadora en lenguaje ensamblador ¨violacion de segmento¨
ASM
|
larapam
|
2
|
6,415
|
12 Mayo 2012, 18:58 pm
por CasiqueCasimiro
|
|
|
Violacion de segmento en producto de matrices
Programación C/C++
|
forakas
|
2
|
3,371
|
28 Diciembre 2012, 04:53 am
por durasno
|
|
|
Problema con un if ( violación de segmentos en tablas bidimiensionales )
Programación C/C++
|
Firefoxes
|
1
|
1,637
|
8 Enero 2018, 19:32 pm
por MAFUS
|
|
|
Problema de violación de acceso. Árbol recubridor
Programación C/C++
|
FranAI
|
1
|
4,805
|
15 Noviembre 2021, 09:28 am
por Eternal Idol
|
|