[sTACK] NASM exit 100



  • Hallöchen,
    ich halbe n kleines Prob und zwar möchte ich einen exit(100) aufruf in meiner Linuxkonsole erzeugen und bekomme da irgendwas nicht richtig hin und stehe bestimmt auf der Leitung.

    exit100.s

    pinky@labor tmp $ cat exit100.s
    BITS 32
    
    mov eax, 0x64
    push eax
    mov eax, 0x01
    push eax
    int 0x80
    

    ihr seht, ich:
    - lade den Wert 100 in eax
    - schiebe es auf den Stack
    - lade den Syscallwert 1 in eax
    - schiebe es auf den Stack
    - rufe den interrupt 80 auf

    Dazu verwende ich noch n kleines Progrämchen. Dieses liest die Binärdatei ein, verbiegt die Rücksprungadresse auf den Puffer, und führt es damit aus.

    prog.c

    #include <stdio.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int run(char *code)
    {
            int ret;
    
            puts("running code...");
    
            *(((unsigned*)&ret) + 2) = (unsigned)code;
    
            return 0;
    }
    
    int main(int argc, char *argv[])
    {
            int fd, bytes;
            char code[1024];
    
            if (argc < 3)
            {
                    fprintf(stderr, "usage: %s --run <file>\n", argv[0]);
                    return 1;        }
    
            if ((fd = open(argv[2], O_RDONLY)) < 0)
            {
                    perror("open() failed");
                    return 1;
            }
    
            if ( (bytes = read(fd, code, 1024)) < 0)
            {
                    perror("read() failed");
                    return 2;
            }
    
            close(fd);
    
            printf("%i bytes read.\n", bytes);
            if (!strcmp(argv[1], "--run"))
                    run(code);
    
            return 0;
    }
    

    Allerdings funzt da irgendwas nicht wie es sollte.

    Ausgabe:

    pinky@labor tmp $ nasm -o exit100 exit100.s
    pinky@labor tmp $ ./tool --run exit100
    14 bytes read.
    running code...
    pinky@labor tmp $ echo $?
    244
    pinky@labor tmp $
    

    Eigentlich sollte statt einer blöden 244 ne richtig schöne 100 stehen ... 😕

    Hat wer zufällig eine Idee?



  • Soweit ich weis werden unter linux
    die Parameter von Systemaufrufen in
    den Registern übergeben und nicht
    am Stack.



  • Das sehe ich auch so.



  • ICh habe noch an einer 2ten Idee gearbeitet aber diese funktioniert auch nicht.

    Idea_2:

    exit100_2.s

    pinky@labor tmp $ cat exit100_2.s
    .section .data
    .section .data
    .globl _start
    
    _start:
    
    movl $1, %eax
    movl $100, %ebx
    int 0x80
    

    OUTPUT:

    pinky@labor tmp $ as exit100_2.s -o exit100_2.o
    pinky@labor tmp $ ld exit100_2.o exit100_2
    pinky@labor tmp $ ./exit100_"
    Segmention fault
    pinky@labor tmp $ echo $?
    139
    

Anmelden zum Antworten