• Inicio
  • Buscar
  • Ingresar
  • Registrarse

    ¿Sabes el motivo de que fallen tanto algunas impresoras Epson?

    • Hack x Crack - Comunidad de Seguridad informática »
    • Programación »
    • ASM »
    • Duda con parámetros de funciones y stack
    • Imprimir
    Páginas: [1]   Ir Abajo

    Autor Tema: Duda con parámetros de funciones y stack  (Leído 6324 veces)

    Desconectado quuim

    • Project Member
    • { L4 } Geek
    • *
    • Mensajes: 430
    • Si votar sirviera para algo, sería ilegal
      • Ver Perfil
    Duda con parámetros de funciones y stack
    « en: Mayo 07, 2016, 08:51:43 pm »
    Reverseando programas simples en C para practicar asm e ing inversa me encontré algo que no termino de entender, cuando paso parámetros a una función, estos se guardan en registros, y después, una vez en la función, se meten al stack. Hasta ahí bien. El problema es donde los mete, porque hay 12 bytes de espacio no usado entre donde guarda los parámetros pasados a la función y las variables internas de la función, muestro el código:

    Código: C
    1. #include <stdio.h>
    2.  
    3. //Los nops son para que se vea mejor la separacion de las instrucciones en el asm
    4. #define N __asm__("nop");
    5.  
    6. int func(int a, int b) {
    7.         int aux = a;
    8.         N
    9.         a += b;
    10.         N
    11.         return a;
    12. }
    13.  
    14. int main() {
    15.         int s = 1;
    16.         N
    17.         int e = 2;
    18.         N
    19.         func(s, e);
    20.         N
    21.         return 0;
    22. }
    23.  

    Y aquí el desensamblado generado por radare2,

    main:
    Código: ASM
    1. / (fcn) sym.main 46
    2. |           ; var int local_4h @ rbp-0x4
    3. |           ; var int local_8h @ rbp-0x8
    4. |           ; DATA XREF from 0x004003cd (sym.main)
    5. |           0x004004c3      55             push rbp
    6. |           0x004004c4      4889e5         mov rbp, rsp
    7. |           0x004004c7      4883ec10       sub rsp, 0x10
    8. |           0x004004cb      c745fc010000.  mov dword [rbp - local_4h], 1
    9. |           0x004004d2      c745f8020000.  mov dword [rbp - local_8h], 2
    10. |           0x004004d9      90             nop
    11. |           0x004004da      8b55f8         mov edx, dword [rbp - local_8h]
    12. |           0x004004dd      8b45fc         mov eax, dword [rbp - local_4h]
    13. |           0x004004e0      89d6           mov esi, edx
    14. |           0x004004e2      89c7           mov edi, eax
    15. |           0x004004e4      e8bdffffff     call sym.func
    16. |           0x004004e9      90             nop
    17. |           0x004004ea      b800000000     mov eax, 0
    18. |           0x004004ef      c9             leave
    19. \           0x004004f0      c3             ret
    20.  

    Función func:
    Código: ASM
    1. / (fcn) sym.func 29
    2. |           ; var int local_4h @ rbp-0x4
    3. |           ; var int local_14h @ rbp-0x14
    4. |           ; var int local_18h @ rbp-0x18
    5. |           ; CALL XREF from 0x004004e4 (sym.func)
    6. |           0x004004a6      55             push rbp
    7. |           0x004004a7      4889e5         mov rbp, rsp
    8. |           0x004004aa      897dec         mov dword [rbp - local_14h], edi
    9. |           0x004004ad      8975e8         mov dword [rbp - local_18h], esi
    10. |           0x004004b0      8b45ec         mov eax, dword [rbp - local_14h]
    11. |           0x004004b3      8945fc         mov dword [rbp - local_4h], eax
    12. |           0x004004b6      90             nop
    13. |           0x004004b7      8b45e8         mov eax, dword [rbp - local_18h]
    14. |           0x004004ba      0145ec         add dword [rbp - local_14h], eax
    15. |           0x004004bd      90             nop
    16. |           0x004004be      8b45ec         mov eax, dword [rbp - local_14h]
    17. |           0x004004c1      5d             pop rbp
    18. \           0x004004c2      c3             ret
    19.  

    Como veis, en la función func los parámetros pasados se guardan en $rbp - 0x14 y $rbp - 0x18, mientras que la variable local se guarda en $rbp - 0x4. Así que siendo todas las variables ints de 4 bytes, ¿Porque quedan 12 bytes libres e inútiles de $rbp - 0x4 a $rbp - 0x10?
    En línea
    Quien rie el último, piensa más lento

    Backtrack - Giving machine guns to monkeys since 2006

    You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to us

    Desconectado stakewinner00

    • { L7 } Juanker
    • *******
    • Mensajes: 1010
      • Ver Perfil
      • http://david.mumei.space
    Re:Duda con parámetros de funciones y stack
    « Respuesta #1 en: Mayo 07, 2016, 11:56:56 pm »
    Si no es por el tema del alignment que hace GCC no tengo ni idea.
    En línea

    Desconectado howara

    • { L3 } Über
    • ***
    • Mensajes: 201
    • Think that your users are stupid and make it easy!
      • Ver Perfil
    Re:Duda con parámetros de funciones y stack
    « Respuesta #2 en: Mayo 08, 2016, 02:25:16 pm »
    He estado un rato pensándolo y bueno, creo que es por el tema de alineamiento que dice stake. Si no me equivoco, en sistemas de 64bits el puntero a la pila apunta a posiciones múltiples de 8 y cuando se necesitan almacenar variables locales, si es menor de 8B se cuenta como si fuera de 8B. Esto nos deja con que en la función podemos decir que existen 3 variables, por lo que se necesitan 3*8=24B y dentro de ese espacio depende de las políticas del compilador el poner los datos en una posición u otra.

    Saludos!
    En línea
    If you have any doubt say it!

    Desconectado ravenheart

    • { L7 } Juanker
    • *******
    • Mensajes: 1359
    • Todos mis mensajes están bajo la licencia WTFPL v2
      • Ver Perfil
    Re:Duda con parámetros de funciones y stack
    « Respuesta #3 en: Mayo 08, 2016, 11:50:48 pm »
    Cita de: howara en Mayo 08, 2016, 02:25:16 pm
    Esto nos deja con que en la función podemos decir que existen 3 variables, por lo que se necesitan 3*8=24B y dentro de ese espacio depende de las políticas del compilador el poner los datos en una posición u otra.

    Eso no es así. La convención de llamada tiene que estar claramente definida. De lo contrario, no habría forma humana de hacer unos bindings para otro lenguaje que puedan funcionar.

    Supongo que la alineación será a 16 bytes y que se alinean por separado argumentos y variables locales.

    Quizá aquí encuentres algo más de información http://www.x86-64.org/documentation/abi.pdf
    « Última modificación: Mayo 09, 2016, 08:37:23 am por ravenheart »
    En línea
    You do not need hope if you have drama to back you up.

    • Imprimir
    Páginas: [1]   Ir Arriba
    • Hack x Crack - Comunidad de Seguridad informática »
    • Programación »
    • ASM »
    • Duda con parámetros de funciones y stack
     

    • SMF | SMF © 2013, Simple Machines
    • XHTML
    • RSS
    • WAP2
    Va un mudo y le dice a un sordo: Hack x Crack usa cookies. Pues eso... Learn more