Así que estaba leyendo Hackeando el arte de la explotación y en el libro, usan el strcpy()
función en su código C:
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
Luego proceden a compilar su código fuente y analizarlo con gdb
. Establece un punto de corte en la línea 6, el strcpy
función, y la línea 8, pero al establecer un descanso en strcpy
se lee lo siguiente:
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Entiendo que esto se debe a que la biblioteca aún no se ha cargado, por lo que le pregunta si quiere tenerla como un punto de interrupción pendiente. Luego ejecuta el programa y continúa a través de los puntos de interrupción:
Todo funciona bien para él, pero cuando traté de recrear esto en mi computadora, obtengo lo siguiente:
frinto@kali:~/Documents/theclang/programs/helloworld$ gcc -m32 -g -o char_array char_array.c
frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
(gdb) break 6
Breakpoint 1 at 0x11b6: file char_array.c, line 6.
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) break 8
Breakpoint 3 at 0x11d7: file char_array.c, line 8.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
(gdb) cont
Continuing.
Hello, world!
[Inferior 1 (process 4021) exited normally]
(gdb)
Observe cómo se saltó por completo el strcpy
punto de ruptura? Bueno, le pregunté a un amigo mío cuál era el problema aquí, y me dijo que me estaba perdiendo el argumento. -fno-builtin
al compilar. Hice algunas búsquedas mínimas en Google sobre este argumento y todo lo que realmente entendí es que le permite establecer puntos de interrupción en funciones integradas. Así que compilé el programa con el -fno-builtin
argumento y luego trató de volver a crear esto de nuevo:
frinto@kali:~/Documents/theclang/programs/helloworld$ gcc -m32 -fno-builtin -g -o char_array char_array.c
frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
(gdb) break 6
Breakpoint 1 at 0x11c6: file char_array.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x1040
(gdb) break 8
Breakpoint 3 at 0x11dc: file char_array.c, line 8.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.
Breakpoint 2, 0xf7e510b0 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
(gdb) cont
Continuing.
Hello, world!
[Inferior 1 (process 3969) exited normally]
(gdb)
¡Ahora funciona! Tengo tres preguntas:
- ¿Qué es exactamente el
-fno-builtin
argumento haciendo? - ¿Por qué muestra signos de interrogación en lugar de la
strcpy
función en
Breakpoint 2, 0xf7e510b0 in ?? () from /lib/i386-linux-gnu/libc.so.6
- ¿Por qué no pide configurar el
strcpy
punto de interrupción como pendiente cuando uso el-fno-builtin
¿argumento?
Perdón por la extensión del hilo, solo quería asegurarme de que se entendiera todo.
2. No ha instalado la información de depuración para su libc. 3. Sabe dónde encontrar strcpy, no tiene que esperar en estado “pendiente”.
– Marc Glisse
20/01/2019 a las 23:30