| Indice |
|---|
| Structured Excepition Handling ovvero SEH |
| SEH frames |
| SEH in una applicazione multithread |
| Exploit tramite SEH |
| Eliminare la terminazione della applicazione |
| Tutte le pagine |
Pagina 3 di 5
Per verificare cosa accade in una applicazione multi-thread utilizzeremo sempre una piccola applicazione, che per ogni thread creato calcolerà la posizione ed il contenuto dei suoi SEH frames.
program SEH2;
{$APPTYPE CONSOLE}
uses
SysUtils,windows;
var
count:integer;
procedure test;
var
xESP:integer;
a,b: ^integer;
id:cardinal;
begin
try
asm
mov eax,fs:[0];
mov a,eax
mov xESP, esp
end;
Writeln;
Writeln('Thread n',count);
//indirizzo della cima dello stack
Writeln(format('ESP :%x <-cima dello stack', [xESP] ));
Writeln;
Writeln(' indirizzo valore');
while (a^ <> -1) do begin
//puntatore al successivo SEH frame
Writeln(format('Eccezione.successivo :%p->%x', [a,a^] ));
b:=a;
inc(b);
//indirizzo della funzione che gestisce l'eccezione
Writeln(format('Eccezione.handler :%p->%x', [b,b^]));
//Aggiorna il puntatore
a:=pointer(a^);
Writeln;
end;
//Stampa i dati sull'ultimo
Writeln(format('Eccezione.successivo :%p->%x', [a,a^] ));
b:=a;
inc(b);
Writeln(format('Eccezione.handler :%p->%x', [b,b^]));
//limito la creazioen dei thread a 2
if count<2 then begin
inc(count);
CreateThread(nil,0,@test,nil,0,id);
end;
except
Writeln('Mia Eccezione test');
end;
end;
begin
count:=0;
test;
readln;
end.
Come output avremo:
Thread n0
ESP :12FF4C <-cima dello stack
indirizzo valore
Eccezione.successivo :0012FF4C->12FF58 (user)
Eccezione.handler :0012FF50->408E61
Eccezione.successivo :0012FF58->12FFB4 (user)
Eccezione.handler :0012FF5C->408EAF
Eccezione.successivo :0012FFB4->12FFE0 (start-up)
Eccezione.handler :0012FFB8->4041B8
Eccezione.successivo :0012FFE0->FFFFFFFF (primario)
Eccezione.handler :0012FFE4->7C839A10
Thread n1
ESP :B3FF58 <-cima dello stack
indirizzo valore
Eccezione.successivo :00B3FF58->B3FF64 (user)
Eccezione.handler :00B3FF5C->408E61
Eccezione.successivo :00B3FF64->B3FFDC (user)
Eccezione.handler :00B3FF68->408EAF
Eccezione.successivo :00B3FFDC->FFFFFFFF (primario)
Eccezione.handler :00B3FFE0->7C839A10
Thread n2
ESP :C3FF58 <-cima dello stack
indirizzo valore
Eccezione.successivo :00C3FF58->C3FF64 (user)
Eccezione.handler :00C3FF5C->408E61
Eccezione.successivo :00C3FF64->C3FFDC (user)
Eccezione.handler :00C3FF68->408EAF
Eccezione.successivo :00C3FFDC->FFFFFFFF (primario)
Eccezione.handler :00C3FFE0->7C839A10
Possiamo notare alcune cose:
- Viene creato uno stack diverso per ogni thread;
- Il SEH frame di start-up appare solo nel thread di processo, cioè nel primo.
- Tutti i SEH frames anche se stanno in stack diversi puntano sempre alle stesse funzioni che gestiscono le eccezioni (handler).
- Le posizioni dei frames all'interno degli stack rimangono le stesse.





