systemadmin.es > Programación > ltrace: Seguir las llamadas a librerías

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) +++
    

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>