Pregunta

Saludos, SO.

Tengo algo de código que he hecho intentos de compilar con gcc, pero mis intentos han sido frustrados. Podría alguien más versado que me ayude con el tema, tal vez hay algo que me falta.

Estoy compilando el código de cocina Linux 2.6.28-15-generic # 49-Ubuntu SMP Mar Ago 18 de 2009 19:25:34 GMT x86_64 GNU / Linux.

int
main(void)
{
    __asm__(
            "xorq %rdx,%rdx"
            "movq $0x68732f6e69622fff, %rdx"
            "shr $0x8, %rbx"
            "push %rbx"
            "movq %rsp,%rdi"
            "xorq %rax,%rax"
            "pushq %rax"
            "pushq %rdi"
            "movq %rsp,%rsi"
            "mov $0x3b, %al"
            "syscall"
            "pushq $0x1"
            "pop %rdi"
            "pushq $0x3c"
            "pop %rax"
            "syscall"
    );

    return 0;
}

El error que se devuelve es:

$ gcc -o shellcode shellcode.c
shellcode.c: Assembler messages:
shellcode.c:4: Error: bad register name `%rdxmovq $0x68732f6e69622fff'

Gracias a todos.

¿Fue útil?

Solución

Es necesario poner saltos de línea (\n) en su ensamblado en línea citado. De lo contrario, se cree que

xorq %rdx,%rdx
movq $0x68732f6e69622fff, %rdx

es realmente

xorq %rdx,%rdxmovq $0x68732f6e69622fff, %rdx

Así que las dos primeras líneas (y así sucesivamente) deben ser de la misma familia:

"xorq %rdx,%rdx\n"
"movq $0x68732f6e69622fff, %rdx\n"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top