io.smashthestack.org / level02_alt

PUBLISHED ON 21/01/2016 — IO.SMASHTHESTACK.ORG, TUTORIALS
$ 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$
TAGS: BASH, C, HACK, HACKS, LINUX