|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
[C/Linux] Le var di ambiente cambiano continuamente indirizzo
Ciao!
Vi risulta per caso che dopo ogni accesso alle variabili d'ambiente (durante una stessa sessione), queste cambino indirizzo di memoria? Considerate questa porzione di un programma che chiameremo getenvaddr.c: Codice:
char *addr;
addr=getenv(argv[1]);
if (addr!=NULL)
printf("Indirizzo di %s: %p\n",argv[1],addr);
Invocando il programma ad esempio con $ ./getenvaddr PATH si ottiene l'indirizzo di memoria in cui dovrebbe essere memorizzata la variabile d'ambiente PATH; ma rieseguendo il programma subito dopo, tale indirizzo cambia, e cosi' ogni volta che lo si esegue! Vi sembra normale? Io sto cercando di realizzare un overflow di puntatore a funzione, in modo tale che il contenuto di un determinato puntatore a funzione (in un programma volutamente vulnerabile) venga sovrascritto con l'indirizzo di una var di ambiente che contiene lo shellcode... ma se ogni volta che tento di ricavare l'indirizzo della variabile poi questo cambia, non riusciro' mai a far assumere al puntatore a funzione l'indirizzo giusto. Secondo voi dove sta l'inghippo?
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
- stai usando uno di quei kernel con alcune patch per la sicurezza, che spostano stack e heap su indirizzi casuali. In questo caso è 100% ripetibile. - hai ricompilato il programma - l'ambiente è cambiato (...e di norma cambia: ad es. viene impostato in alcune variabili d'ambiente l'ultimo programma eseguito, l'ultimo return code, e altre cose dinamiche simili)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Boh... escluderei la seconda e la terza ipotesi. Il programma e' sempre quello (getenvaddr), ed eseguendolo 10 volte in sequenza, senza fare nient'altro, l'indirizzo stampato cambia sempre, e apparentemente non c'e' modo di prevedere quale indirizzo stampera' la volta successiva (non c'e' una progressione regolare o roba simile).
Mi sa che ho un kernel come dici tu... Uffa! Ho un sistema inattaccabile Vabbe', provero' su qualche altro kernel... Grazie
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Interessante, non sapevo che ce ne fossero di simili già in giro. Puoi verificare se con questo programma hai risultati sempre differenti?
Codice:
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
int main(void)
{
long addr;
void *map;
asm(
"movl %%esp, %0"
:"=g"(addr) : );
map = mmap(NULL, getpagesize(),
PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
printf("esp=0x%08lx map=%p\n", addr, map);
return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 20-05-2005 alle 17:57. |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
oggi ho imparato che includere assembly in C col gcc è un casino.
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
Cmq sto usando semplicemente il kernel di Fedora Core 3, il 2.6.9-1.667, roba che e' in giro da sei mesi... credo Ah, ho fatto un tentativo su una Slackware 9.2 che usa un kernel 2.6.10 compilato da me: l'indirizzo delle var di ambiente non cambia, nel programma vulnerabile riesco a sovrascrivere il puntatore a funzione con l'indirizzo esatto della variabile d'ambiente che contiene lo shellcode, ma all'invocazione della funzione mi da' segmentation fault. Eppure il programma ha il bit suid impostato. Gia' che siamo in tema, sapreste consigliarmi un manualetto di assembly x86 per principianti? Magari liberamente scaricabile dalla rete? Intanto cerco qualcosa con Google... Gica
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:00.



















