io.smashthestack.org / level02

PUBLISHED ON 21/01/2016 — IO.SMASHTHESTACK.ORG, TUTORIALS
$ 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

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,…).

signal

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.

abs

Funkcija int abs(int j);, vrne absolutno vrednost celega števila. Absolutna vrednost najbolj negativnega celega števila ni definirana.

Epilog

level2@io:/levels$ ./level02 -2147483648 -1
source code is available in level02.c

WIN!
sh-4.2$ 
TAGS: BASH, C, HACK, HACKS, LINUX, SMASH