Sdc si consideras que solo me vas a ayudar tu xD lo puedes mover dentro del otro pa no tener un revoltijo de mensajes de mis desventuras

Weno me explico con este nuevo problema, como ya comente en el anterior, consegui hacer funcionar akello nada mas postear la duda en el foro asi que voy a hacer lo mismo a ver si me viene la iluminacion divina ^^.
Ahora estoy intentando escribir un array que escriba por pantalla usando printf... me esta dando un fallo de segmentacion y/o de instruccion ilegal (ahora si) y depurando como de costumbre conozco el pk del fallo pero no el pk se llega alli, lo expongo.
Como siempre primero escribo el programa en ensamblador para luego ver el codigo hexadecimal, el programa en cuestion es este:
.text
.globl main
main: pushl %ebp
movl %esp, %ebp
sub $0x10, %esp
jmp 0xf
pop %esi
movl %esi, (%esp)
call printf
leave
ret
call -0xc
.string "aaaa\n"
Explicacion: Primero las 3 instrucciones de prologo de siempre, luego el truco del jmp y call, para que se quede en la pila la "direccion de retorno" del call (la direccion de la string), de esa forma al volver al pop %esi de arriba pondremos en el registro esi la direccion de la ristra, luego pongo la direccion en la cima de pila y llamo a printf pa que imprima por pantalla y luego retorno trankilamente.
Ese programa escrito en ensamblador funcion, pruebalo:
$ gcc -gstabs+ -o nombrekekieras nombreprograma.s
escribe "aaaa" por la pantalla y ya esta. Bueno, despues con el gdb lo destripo, es decir cojo su codigo en ensamblador, os pongo la capturilla de pantalla:
(gdb) disassemble main
Dump of assembler code for function main:
0x08048360 <main+0>: push %ebp
0x08048361 <main+1>: mov %esp,%ebp
0x08048363 <main+3>: sub $0x10,%esp
0x08048366 <main+6>: jmp 0x8048376 <main+22>
0x0804836b <main+11>: pop %esi
0x0804836c <main+12>: mov %esi,(%esp)
0x0804836f <main+15>: call 0x80482b0 <printf@plt>
0x08048374 <main+20>: leave
0x08048375 <main+21>: ret
0x08048376 <main+22>: call 0x804836b <main+11>
0x0804837b <main+27>: popa
0x0804837c <main+28>: popa
0x0804837d <main+29>: popa
0x0804837e <main+30>: popa
0x0804837f <main+31>: or (%eax),%al
0x08048381 <main+33>: nop
0x08048382 <main+34>: nop
0x08048383 <main+35>: nop
End of assembler dump.
(gdb) x /21bx main+6
0x8048366 <main+6>: 0xe9 0x0b 0x00 0x00 0x00 0x5e 0x89 0x34
0x804836e <main+14>: 0x24 0xe8 0x3c 0xff 0xff 0xff 0xc9 0xc3
0x8048376 <main+22>: 0xe8 0xf0 0xff 0xff 0xff
(gdb)
Ahi se puede ver el codigo en hexadecimal que deberiamos poner en un buffer en C (de char of course) para saltar a el y ejecutarlo. Tb he hecho ese programa, keda algo asi:
unsigned char chacho[] = "\xe9\x0b\x00\x00\x00\x5e\x89\x34\x24\xe8\x3c\xff"
"\xff\xff\xc9\xc3\xe8\xf0\xff\xff\xff\x61\x61\x61"
"\x61\x00";
int main()
{
int *ret;
ret = (int*)((&ret) + 2);
(*ret) = (int)chacho;
}
No tiene mucha ciencia, la parte del main, esta bien, esta copiada y pegada del programa anterior que si funcionaba, ademas la he depurado y si se ejecuta como debe ser, ahora os pongo una ejecucion con el gdb donde se da el fallo de este codigo y no se pk ocurre pero si donde:
(gdb) l 1,30
1 unsigned char chacho[] = "\xe9\x0b\x00\x00\x00\x5e\x89\x34\x24\xe8\x3c\xff"
2 "\xff\xff\xc9\xc3\xe8\xf0\xff\xff\xff\x61\x61\x61"
3 "\x61\x00";
5
6 int main()
7 {
8 int *ret;
9
10 ret = (int*)((&ret) + 2);
11 (*ret) = (int)chacho;
12 }
(gdb) br 10
Breakpoint 1 at 0x8048348: file maspruebas.c, line 10.
(gdb) r
Starting program: /home/ole/Cosas_aprender/Wargames/PullThePlug/Vortex/level1/pruebas/maspruebas
Breakpoint 1, main () at maspruebas.c:10
10 ret = (int*)((&ret) + 2);
(gdb) s
11 (*ret) = (int)chacho;
(gdb) s
12 }
(gdb) s
0x08049580 in chacho ()
(gdb) p /x &chacho
$1 = 0x8049580
(gdb) p /x *(int*)$eip
$2 = 0xbe9
(gdb) s
Single stepping until exit from function chacho,
which has no line number information.
Program received signal SIGSEGV, Segmentation fault.
0x080494cd in _DYNAMIC ()
(gdb)
Vemos como muestro la funcion para que todo el mundo vea que es la misma que ejecuto, pongo breakpoint en el principio y ejecuto hasta que llega a "chacho", vemos como eip tiene la direccion de chacho y tb como a lo que apunta es a la primera instruccion la cual se supone que es el jmp pero cuando le dio a seguir pa que salte, el tio salta, pero a la direccion 0x080494cd que es mas pequeña que 0x8049580 (jmp) lo que quiere que esta saltando hacia el lado contrario de donde quiero y ademas una cantidad de bytes que no es la que corresponde pk 0x8049580-0x080494cd=b3=179 bytes, y no los 0xf que le pido yo...
Weno pos ese es el problema, que no tengo ni idea de pk salta pal otro lado :s estoy intentando buskar alguna cosa que me diga como se codifican las instrucciones de un intel pentium (que es pa lo que compilo) pa ver si poniendo los 5 bytes de la instruccion jmp en binario veo el problema, pero todavia no lo he encontrado... Y me moskea mucho que en ensamblador me funcione y no asi en C :s.
Cualquier idea siempre es bien recibida, muchas gracias.
PD: En un principio tenia mis dudas con el hecho de que no incluia la stdio.h pa la funcion printf, pero al programar en ensamblador me di cuenta de que el ensamblador la enlaza si ve un call a ella, de todas formas tb he probado a ponerle el include en el codigo de C y nada, logico pk por ahi no es donde falla xDD.
PDD: Ire poniendo el avance y solucion si encuentro pa que no kede en el aire.










Autor



En línea




