64 bit Linux'ta C'deki Biçim Dizisi Güvenlik Açığı'nın basit bir örneğini uygulamaya çalışıyorum. Aşağıdaki dizeBiçim Dizesi Exploit, beklenmeyen sonuç
AAAABBBB-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x
programlamak için
void not_called() {
printf("Exploited\n");
}
int main(int argc, char **argv) {
// Buffer overflow vulnerability
char buffer[256];
gets(buffer);
// User may input the format string
printf(buffer);
}
ben girişi Ve sonuç ben 41414141
olarak AAAA nokta olabilir ama BBBB takip etmiyor
AAAABBBB-8608002c-f458fe00-fbad2288-78252d78-252d7825-5e5c51a8-0-41414141-2d78252d-78252d78-252d7825-2d78252d
geçerli: İşte benim kaynak kodu beklediğim gibi, tampondaki aynı girdi dizesinin ayrılmaz bir parçası.
Bu bir çeşit koruma mekanizması mı yoksa bir şeyi yanlış yorumlu muyum? Amacım, iade adresinin üzerine yazmam ve 64 bitlik makinede çalışırken 8 bayt (AAAABBBB) okumam gerekiyor. dizeyi istismar için
Sözde kod
RETRNPTR%[decimal address of not_called - 8]u%[offset of RETRNPTR]$n
RETRNPTR benzer görünümde olacaktır şimdiki yığın çerçevede dönüş adresini saklamak belleğin adresidir.
En büyük endişem şu ki, 8 baytlık RETRNPTR beklendiği gibi sürekli bellekte görünmüyor. İkinci endişe,% n, int-pointer, yani sadece 4 bayt yazılır. Ayrıca, AAAA'dan önceki değerlerin nereden geldiği konusunda kafam karıştı.
Sen tanımsız davranış çağırıyoruz aldık. Tam olarak ne olduğunu anlamak için sökmeye bakın. –
C dilinde 'gets' denen bir işlev yoktur. C bilginizi güncellemeniz gerekiyor, 'gets' 17 yıl önce eskimiş olarak işaretlendi. – Lundin
Ve ne düşünüyorsunuz printf ("AAAABBBB-% x-% x-% x-% x-% x-% x-% x-% x-% x-% x-% x-% x") ' Hiçbir değişken listesi ile belirtilen yok mu? – Lundin