Llamadas indirectas a funciones anidadas en GCC sin pila ejecutable

Indirect Calling of Nested Functions on GCC Without Executable Stack

Martin Uecker explica cómo evitar la pila ejecutable al usar funciones anidadas de GCC en versiones anteriores a GCC 17. Analiza el mecanismo de trampolines que GCC genera para capturar variables, y propone un truco: extraer la dirección del código y la cadena estática del trampolín para llamar directamente a la función con __builtin_call_with_static_chain, y luego limpiar la marca de pila ejecutable con patchelf. También sugiere tratar los trampolines como descriptores de función, interpretándolos en el punto de llamada. Todo está implementado en su biblioteca experimental noplate.

En lugar de invocar el trampolín, podríamos decir que estamos interpretando el código del trampolín en el lugar de la llamada usando un intérprete súper simple que solo puede interpretar esta secuencia de código específica y que es tan simple que se puede incluir en línea.
  1. inigyou

    El código automodificable es genial. Es una pena que tuviéramos que desactivarlo por seguridad.

  2. mananaysiempre

    Relacionado: artículo anterior de la serie, https://news.ycombinator.com/item?id=49308685 (103 puntos, 47 comentarios)

  3. gue5t

    Al principio, me molestó tener que leer sintaxis AT&T. Luego me desorienté al darme cuenta de que el siguiente fragmento estaba en sintaxis AT&T sin el signo '%' para los registros. Pero la técnica es genial.

  4. Dwedit

    ¿Para qué necesitas la pila ejecutable? Llamas usando un puntero a función, no hay memoria de lectura/escritura ejecutable involucrada en el uso de un puntero a función.

Más de este día

2026-08-29