Merhaba, tekrar ben ve tekrar yeni bir protostar challengei. Busefer sadece 1 adet soru cozumu yapabilecegim cunku gercekten bir function overload etmek beni bu kadar yormamisti.
Soru -> Bizden istenen bufferi'i overflow edip hic cagirilmayan win fonksiyonunu cagirmak.
Ipucu olarak gdb ve object dump yardimci olur denmis.
Simdi ilk olarak buna daha once paylastigim 0-2 stacklerindeki gibi bir yaklasimda bulunmak faydali olabilir diye dusundum. Ama istedigim sonucu bir turlu alamadim.
Yaklasik son 1 saattir debuggerla icli disli oldum. Sonra garip bir sekilde calisti.
Cozume gececek olursam, hemen gdb yi acip disassemblerimi ayarladim. Burada onemli olan bir husus, win() fonksiyonun memorydeki adresi. onu da
yazarak elde ettik.
Artik disassemblera gecebilriiz:
Simdi onumuze gelen info dumpta neden 0x08048475 adresine breakpoint attigimi soruyor olabilirsiniz kendinize. Aciklayayim. Eax genel registerlardan bitanesidir ve genel olarak input output aritmetik vs icin kullanilir. "0x08048475" Bu noktada eax cagirilmasi bana sunu dusundurtuyor, demek ki burada input aliniyor. Bu yuzden, debug'in kalan kismini bu noktada yogunlasarak devam ettirecegim.
Gecen orneklerde de oldugu gibi bufferin kapasitesi 64. Bu demekki 65 ve uzeri uzunluktaki her input bufferi overflow etmeye yetecek. Buradaki onemli durum overflow ederken fonksiyonun adresi ile etmemiz gerektigi.
Gecen orneklerden de oldugu uzere ezberden bir input verdim. Scriptin icerigi:
idi. Bu scripti input olarak kullanabilmem icin once onu bir degisken haline getirmem gerekiyordu ve outputu test dosyasina pipeladim.
Daha sonra gdb icerisinde r(run) < ~/test ile programa inputu gonderdim. Daha sonra
"info registers" ile gonderdigim inputun ne derece etki ettigine baktim. Ama aldigim sonuc biraz garip geldi. 0x42'nin karakter karsiligi B, 0x41'in A. Bekledigim sonuc 0x41414142 iken tam tersini aldim.
Programin little Endian oldugu tamamen aklimda cikmisti. Bu yuzden surec gereksiz derecede uzadi.
Daha sonra scripti bu sekilde degistirip tekrar "python stack3.py > text" ile test dosyasina pipeladim.
Ve sonunda sonuca su sekilde ulastim ulastim.
Lakin basta da belirttigim uzere, kodun little endian olusunu unutmam sureci bi nebze uzatti uzatmasina da, bir noktada debugger da cildirdi. Memoryi uzerine yazdirmamak icin direndi diyebilirim. Hic olmadik adresleri falan uzerine yazdi. Yani 0x841 input verip registerda 0x32380 gibi bir sonucla karsilastim uzun sure. Umarim basiniza gelmez.
Bu arada reverse engineering ile ilgileneniz varsa, ya da merak edeniniz varsa iyaretci sayfama belirttiginiz taktirde radare2 ile ilgili calismalarimi sizlerle paylasmaya calisabilirim.
Tekrardan, Saglicakla~
Soru -> Bizden istenen bufferi'i overflow edip hic cagirilmayan win fonksiyonunu cagirmak.
Ipucu olarak gdb ve object dump yardimci olur denmis.
Kod:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
vo id win()
{
printf("code flow successfully changed\n");
}
int main(int argc, char **argv)
{
volatile int (*fp)();
char buffer[64];
fp = 0;
gets(buffer);
if(fp) {
printf("calling function pointer, jumping to 0x%08x\n", fp);
fp();
}
}
Simdi ilk olarak buna daha once paylastigim 0-2 stacklerindeki gibi bir yaklasimda bulunmak faydali olabilir diye dusundum. Ama istedigim sonucu bir turlu alamadim.
Yaklasik son 1 saattir debuggerla icli disli oldum. Sonra garip bir sekilde calisti.
Cozume gececek olursam, hemen gdb yi acip disassemblerimi ayarladim. Burada onemli olan bir husus, win() fonksiyonun memorydeki adresi. onu da
Kod:
x win
Artik disassemblera gecebilriiz:
Gecen orneklerde de oldugu gibi bufferin kapasitesi 64. Bu demekki 65 ve uzeri uzunluktaki her input bufferi overflow etmeye yetecek. Buradaki onemli durum overflow ederken fonksiyonun adresi ile etmemiz gerektigi.
Gecen orneklerden de oldugu uzere ezberden bir input verdim. Scriptin icerigi:
Kod:
print "A"*65 + "BBBB"
Daha sonra gdb icerisinde r(run) < ~/test ile programa inputu gonderdim. Daha sonra
"info registers" ile gonderdigim inputun ne derece etki ettigine baktim. Ama aldigim sonuc biraz garip geldi. 0x42'nin karakter karsiligi B, 0x41'in A. Bekledigim sonuc 0x41414142 iken tam tersini aldim.
Programin little Endian oldugu tamamen aklimda cikmisti. Bu yuzden surec gereksiz derecede uzadi.
Daha sonra scripti bu sekilde degistirip tekrar "python stack3.py > text" ile test dosyasina pipeladim.
Ve sonunda sonuca su sekilde ulastim ulastim.
Lakin basta da belirttigim uzere, kodun little endian olusunu unutmam sureci bi nebze uzatti uzatmasina da, bir noktada debugger da cildirdi. Memoryi uzerine yazdirmamak icin direndi diyebilirim. Hic olmadik adresleri falan uzerine yazdi. Yani 0x841 input verip registerda 0x32380 gibi bir sonucla karsilastim uzun sure. Umarim basiniza gelmez.
Bu arada reverse engineering ile ilgileneniz varsa, ya da merak edeniniz varsa iyaretci sayfama belirttiginiz taktirde radare2 ile ilgili calismalarimi sizlerle paylasmaya calisabilirim.
Tekrardan, Saglicakla~
Son düzenleme: