•
ltrace: Seguir las llamadas a librerías
De la misma manera que con strace seguimos las llamadas a sistema, mediante ltrace podemos seguir las llamadas a librerías.
En el wargame behemoth ya hemos visto su funcionamiento, simplemente ejecutamos el programa con ltrace y nos mostrará las llamadas a librerías compartidas. En el siguiente ejemplo podemos apreciar la llamada a strncmp:
level1@io:/levels$ ltrace ./level01 aa
__libc_start_main(0x80483f4, 2, 0xbfffddc4, 0x8048510, 0x80484c0 <unfinished ...>
strncmp("aa", "omgpassword", 11) = -14
puts("Fail."Fail.
) = 6
+++ exited (status 0) +++
Admite opciones similares a strace, por ejemplo:
- Mediante -f permite seguir también las llamadas de los procesos hijo que se esta traceando
- Mediante -s podemos indicar el tamaño de la cadena a mostrar. Por ejemplo, usando una cadena más pequeña veríamos:
level1@io:~$ ltrace -s1 /levels/level01 aaaa __libc_start_main(0x80483f4, 2, 0xbfffddc4, 0x8048510, 0x80484c0 <unfinished ...> strncmp("a"..., "o"..., 11) = -14 puts("F"...Fail. ) = 6 +++ exited (status 0) +++ - Mediante -o podemos indicar un fichero dónde guardar las llamadas realizadas en lugar de imprimirlo por stderr
También de propias:
- Mediante -S podemos ver también las llamadas a sistema, de una foma similar al strace, pero quizá menos comprensible:
level1@io:~$ ltrace -S /levels/level01 aaaa SYS_brk(NULL) = 0x804a000 SYS_uname(0xbfffdb12) = 0 SYS_access("/etc/ld.so.nohwcap", 00) = -2 SYS_mmap2(0, 8192, 3, 34, -1) = 0xee8000 SYS_access("/etc/ld.so.preload", 04) = -2 SYS_open("/etc/ld.so.cache", 0, 00) = 3 SYS_fstat64(3, 0xbfffd3f8, 0xac1ff4, -1, 3) = 0 SYS_mmap2(0, 14548, 1, 2, 3) = 0xf30000 SYS_close(3) = 0 SYS_access("/etc/ld.so.nohwcap", 00) = -2 SYS_open("/lib/libc.so.6", 0, 034324) = 3 SYS_read(3, "\177ELF\001\001\001", 512) = 512 SYS_fstat64(3, 0xbfffd474, 0xac1ff4, 3, 1) = 0 SYS_mmap2(0, 0x13d670, 5, 2050, 3) = 0x737000 SYS_mmap2(0x86f000, 12288, 3, 2066, 3) = 0x86f000 SYS_mmap2(0x872000, 9840, 3, 50, -1) = 0x872000 SYS_close(3) = 0 SYS_mmap2(0, 4096, 3, 34, -1) = 0x258000 SYS_set_thread_area(0xbfffd988, 0x2586b0, 0xac1ff4, 1, 0) = 0 SYS_mprotect(0x86f000, 4096, 1) = 0 SYS_munmap(0xf30000, 14548) = 0 __libc_start_main(0x80483f4, 2, 0xbfffddc4, 0x8048510, 0x80484c0 <unfinished ...> strncmp("aaaa", "omgpassword", 11) = -14 puts("Fail." <unfinished ...> SYS_fstat64(1, 0xbfffdbd8, 0x870ff4, 0x8714e0, 0x8714e0) = 0 SYS_mmap2(0, 4096, 3, 34, -1) = 0xa68000 SYS_write(1, "Fail.\n", 6Fail. ) = 6 <... puts resumed> ) = 6 SYS_exit_group(0 <no return ...> +++ exited (status 0) +++ - Mediante -l podemos indicar una librería en concreto. Por ejemplo, la llamada is_selinux_enabled pertenece a libselinux:
# ltrace cp 2>&1| grep seli is_selinux_enabled(1, 0x7fff91ea8a58, 0x7fff91ea8a68, 0x40acb0, 0x32b9d4f2b0) = 0
Por lo que si ejecutamos el ltrace indicando que solo queremos ver dicha librería obtendríamos:
# ltrace -l /lib64/libselinux.so.1 cp is_selinux_enabled(1, 0x7fff278e5a58, 0x7fff278e5a68, 0x40acb0, 0x32b9d4f2b0) = 0 cp: missing file operand Try `cp --help' for more information. +++ exited (status 1) +++
Relacionados
Imprimir
Deja un comentario: