Naloge so povzete po Smashing the stack for fun and profit.

Popravi spodnji program v skladu z navodili v komentarjih

#include <stdio.h>

int foo(int x){
    unsigned long *y;
    unsigned long z;
    z = x + 30;
    /* Add some code here, change nothing else */
    /* End custom code */
    return 20;
}

int main(int argc, char* argv[]){
    int a = 14;
    int b = 2;
    a = foo(a);
    a = a + 7;
    a = a + b;
    printf("a: %d\n", a); /* output 16 here */
    return 0;
}

Pot do rešitve

Program odpreš v gdb. S pomočjo "disassemble main" ugotoviš, na katerih naslovih se izvede prištevanje. Pravilno popraviš spremenljivki v funkciji tako, da se nepotrebna koda ne izvede.

Uporabni ukazi:

gcc -g hello.c -o hello
gdb hello

Uporaba gdb:

disassemble main
break foo
run
si
p %rsp
p y
p/x *y
p/x *(y+2)
p 0x4455 - 0x556

Napiši program v zbirniku, ki zažene /usr/bin/python (shellcode)

Pot do rešitve

Napišeš minimalen program. Prevedeš z gcc -S. Kodo v main nadomestiš s pripravljanjem registrov in sistemskim klicem. Sistemski klici za amd64, i386.

Uporabni ukazi:

gcc -S syscall\_test.c
gcc syscall\_test.s -o syscall\_test
r2 syscall_test

Uporaba radare2:

v (visual mode)
p (preklop na naslednji prikaz)

Napiši program, kjer je shellcode v nizu

Pot do rešitve

Poskrbimo, da je pot do executabla na koncu niza. Naslov dobimo tako, da izvedemo call tik izpred začetka niza, nato pa s pop s stacka dobimo njegov naslov.

Vse pojavitve \0, predvsem v immediate argumentih, nadomestimo z zamenjavo ukazov.

Nato napišemo C-jevski program, v katerem se string kliče kot funkcija. Prevedemo ga z:

gcc str_shellcode_test.c -z execstack -o str_shellcode_test

Ta program vzami kot osnovo:

#include <stdio.h>

char koda[] = "tulebonekajdrugega/usr/bin/python";

int main(){
    ((void(*)())koda)();
    return 0;
}

Naloge za danes (staro):

  • Napišite svoj exploit, ki izkoristi buffer overflow v vašem programu.
  • Omejite program, da tudi, če ga exploitate, ne bo mogel sistemu storiti nič žalega.
  • Preverite, ali je na sistemu rootkit.

Buffer overflow

Originalni dokument: tutorial on buffer overflows.

GDB - uporabni ukazi

Prevajanje programa:

gcc -g program.c -o program

Zagon programa:

gdb program run

Dodajanje breakpointa, izvajanje naslednjega ukaza, izpis spremenljivke, strojne kode, i.t.d. (vse v gdb):

break main si p/x spremenljivka_A + *spremenljivka_B disassemble main p $rax # izpiši register rax list # izpiši izvorno kodo attach 12333 # priklopi se na proces s PID 12333

radare2 - uporabni ukazi

Program radare2 je uporabno orodje za pregledovanje delovanja programov.

Primer zagona:

r2 -d program

Osnovni ukazi:

  • ? - help
  • v - visual mode
  • q - izhod
  • db sym.main - breakpoint na main
  • dc - continue
  • ds - single step

Znotraj visual mode:

  • p - naslednji način prikaza
  • ! - multi-panel mode

Apparmor

Apparmor je dokaj preprost sistem, ki na Linux sistemih omogoča, da omejite dostop programov do datotek in ostalih resursov (npr. mreže).

Deluje na osnovi profilov. Profil ustvarite z ukazom aa-complain. Uporabite ga z ukazom aa-enforce.

Sistemi za odkrivanje rootkitov

Rootkite odkrivamo tako, da preverimo, ali je kdo nadomestil sistemske programe in ali kak program spreminja seznam procesov. Najbolj znana sta chrootkit in rkhunter.

Sistem za pisanje rootkitov

Za pisanje rootkitov lahko uporabimo metasploit. Gre za sistem, ki omogoča, da iz najdene varnostne luknje naredimo exploit.

Zadnja sprememba: sreda, 29. maj 2019, 13.22