Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

186
Vistas
empujando la pila

Estoy tratando de entender cómo funciona exactamente la pila, así que recrearé aquí un pequeño ejemplo con algunas preguntas.

Supongamos que tengo un pequeño código en ASM que hace lo siguiente:

(todo esto es x86, sintaxis Intel, Linux)

 push ebp mov ebp, esp sub esp, 16 mov eax, 0xdeadbeef <-- let's call this 'local variable a' mov [ebp - 16], eax mov eax, 0xabcdabcd <-- let's call this 'local variable b' mov [ebp - 12], eax mov eax, 0xcacafafa <-- let's call this 'local variable c' mov [ebp - 8], eax mov eax, 0xdada1111 <-- let's call this 'local variable d' mov [ebp - 4], eax call 0x10101010 <------- pretend that is the real address of function_B mov esp, ebp pop ebp ret

Ahora imagine que tengo una función C llamada function_B que se llama desde el código asm y se ve así:

 asmlinkage void function_B(void){ //some code here... }

¿Cómo accedería a a , b , c y d desde function_B con código ASM en línea?

¿Funcionaría esto? ¿Debería hacerlo de otra manera?

 uint32_t val_a; __asm__ __volatile__( ".intel_syntax noprefix;" "mov %0, dword [ebp + 4 + 4 + 0];" ".att_syntax;" : "=r" (val_a) ); uint32_t val_b; __asm__ __volatile__( ".intel_syntax noprefix;" "mov %0, dword [ebp + 4 + 4 + 4];" ".att_syntax;" : "=r" (val_b) );

Además, ¿cómo accedería a a , b , c y d si mi función se viera así:

 asmlinkage void function_B(unsigned int val){ //some code here... }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿Qué pasa con esto?

 void function_B(uint32_t fake){ uint32_t* poke = &fake; uint32_t a = poke[0]; uint32_t b = poke[1]; uint32_t c = poke[2]; uint32_t d = poke[3]; }

Lo que le dará los valores de a, b, c y d con su código asm actual (que no está enviando ningún argumento a function_B). Si también desea pasar argumentos reales a function_B, aún puede agregar el falso después del último argumento real:

 void function_B(unsigned int val,uint32_t fake)

En realidad, es un poco más seguro hacerlo así (luego con asm en línea) ya que tiene más posibilidades de sobrevivir a las optimizaciones (como la omisión de marcos de pila). Pero sigue siendo un truco, por supuesto, y nada en lo que confiaría demasiado.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda