Linux kernel 3.2 syscalls

2

Solo intento obtener las instrucciones del ensamblador para < __ execve > del código a continuación porque quiero construir la lista de códigos de operación de generación de shell:

#include <stdio.h>
int main()
{
     char *happy[2];
     happy[0] = "/bin/sh";
     happy[1] = NULL;
     execve (happy[0], happy, NULL);
}

Objdump me da esto:

8053a20:    53                      push   %ebx
8053a21:    8b 54 24 10             mov    0x10(%esp),%edx
8053a25:    8b 4c 24 0c             mov    0xc(%esp),%ecx
8053a29:    8b 5c 24 08             mov    0x8(%esp),%ebx
8053a2d:    b8 0b 00 00 00          mov    $0xb,%eax
8053a32:    ff 15 a4 d5 0e 08       call   *0x80ed5a4
8053a38:    3d 00 f0 ff ff          cmp    $0xfffff000,%eax
8053a3d:    77 02                   ja     8053a41 <__execve+0x21>
8053a3f:    5b                      pop    %ebx
8053a40:    c3                      ret    
8053a41:    c7 c2 e8 ff ff ff       mov    $0xffffffe8,%edx
8053a47:    f7 d8                   neg    %eax
8053a49:    65 8b 0d 00 00 00 00    mov    %gs:0x0,%ecx
8053a50:    89 04 11                mov    %eax,(%ecx,%edx,1)
8053a53:    83 c8 ff                or     $0xffffffff,%eax
8053a56:    5b                      pop    %ebx
8053a57:    c3                      ret    
8053a58:    90                      nop
8053a59:    90                      nop
8053a5a:    90                      nop

De varios textos que he leído, se suponía que había un int 0x80 en algún lugar de la salida anterior. ¿Por qué no hay uno?

¿Hay cambios importantes en el kernel 3.2 con respecto a cómo funcionan las llamadas que pueden afectar los algoritmos de construcción de código de shell (cargas de registros específicos, etc.) que se presentan en libros escritos hace 3-4 años? El volcado anterior se ve muy diferente de la salida presentada en el "Manual de Shellcoders" o "Aplastar la pila"

¡Gracias!

    
pregunta kawa 20.01.2013 - 10:42
fuente

2 respuestas

3

Las interrupciones tienen una sobrecarga de rendimiento considerable, Linux se ha movido a syscall / sysenter en x86 donde se admite. El pseudo-dll "linux-gate.so" de VDSO (que ldd mostrará) hace que la llamada más rápida específica de la plataforma, puede leer más aquí:

  • enlace (¿Qué es mejor "int 0x80" o "syscall"?)
  • enlace (¿Cómo invocar una llamada del sistema a través del sysenter en ensamblaje en línea (x86 / amd64 linux)?)
  • enlace (Linux 2.5 obtiene vsyscalls, soporte de sysenter)

El código que usa 0x80 continuará funcionando, aunque las versiones actuales de glibc no usarán ese método en las plataformas modernas x86 y los kernels de Linux.

    
respondido por el mr.spuratic 20.01.2013 - 16:04
fuente
0

Al escribir el código C y llamar a una "función de llamada al sistema" como execve() , en realidad no salta directamente al kernel; llama a una función en la biblioteca estándar de C, que realiza el salto al kernel (el int 0x80 ). De esta manera, el compilador de C no tiene que saber nada acerca de la convención de llamadas al kernel, y esto permite cambios a lo largo del tiempo (por ejemplo, reemplazar una llamada del sistema por una mejor, con una API distinta: se debe modificar el libc, no las aplicaciones). ).

Para hacer una llamada directa al sistema, debe recurrir a writing a usted mismo. Es posible que desee consultar el código fuente de libc para obtener orientación.

    
respondido por el Thomas Pornin 20.01.2013 - 15:28
fuente

Lea otras preguntas en las etiquetas