Tekrardan merhabalar. Aslinda gun icerisinde bir baska konu daha acmayi planlamiyordum lakin, bos durmaktan iyidir diyip devam ediyorum.
Hemen hizli bir sekilde bizden istenilen soru ile baslayalim:
Soru bizden bu kodda yine win() fonksiyonunu calistirmamizi istiyor. Onemli bir ipucu olarakda, eip(instruction pointer'in yani fonksiyonu calistiracak pointerin) bu sefer bufferin hemen sonunda olmadigini belirtmis. Yani bu demek ki, daha onceki sorularda yaptigimiz 64 u gecirelim, sonra overwrite edelim mantigi burada o kadar kolay olmayabilir.
Sorunun cozumu icin iki farkli yol izlenebiliyor. Ikiside gayet basit.
Lakin ben biraz daha uzun olani izleyecegim cunku digerine gore anlasilabilirligi daha yuksek.
Ek olarak stack0-2 araliginda belirttigim bazi komut ve tanimlari hatirlamaniz gerekebilir.
Cozume gecelim. Yine her zamanki gibi, gdb yi acip assembly flawor'i intel yaptim. Maini disassembleladim.
Simdi burasi onemli. Bize lazim olan iki sey var:
Daha sonra break point atiyoruz. Ben burada once fonksiyonun cagirildigi yeri breaklemistim ama esp'nin icinde isime yarayacak bisey bulamayinca leave komutuna break attim.
Bu sekilde gets() fonksiyonu calisip isini bitirdikten sonraki stack icerigini gozlemleyebilecektim.
Gecen seferkinin aksine isler bu defa yolunda gitti. Stack pointerini checkliyorum.
Resimden de goreceginiz uzere, input olarak her zamanki 'print "A"*64 + "BBBB"
gondermistim. Stack icerisindeki 0x414141 ler AAAA lari 42 ler ise BBBB yi temsil ediyor.
Normalde eip BBBB nin oldugu yerden islem yapiyordu. Ama bu defa devaminda 0x00 ve iki base pointer degeri var. Ikisinin base pointer degeri oldugunu altta 'x/2x $ebp' ile kontrol ettigim icin biliyorum. Simdi bu degerlerden hangisi degerleri stack'e kaydedecek onu denemek lazim. Ilk olarak 0xbff'liyi denedim ama istedigim sonucu vermedi.
Onemli: memory noktasinda gordugunuz her 0x0 li deger icin bit hesabi yaparak inputlari gonderiyorum. her deger 4 bit. yani gondereceginiz input degerini 4'er sekilde arttirmaniz gerekiyor. ilk basta gonderdigimiz 64 ve + 4 "BBBB" vardi yani 68. 0xbff icin 72 gondermeniz gerekmekte.
0xbff li calismadigi icin diger degeri denedim. Onada input olarak "print 'A'*76 + 'BBBB'" gonderip denedim. Istedigimi aldim.
Aradagim memory noktasina ulasabildigim icin, geriye kalan tek sey scriptte win() fonksiyonun lokasyonunu iletmek kaliyordu. Onuda :
bu sekilde ayarlayarak programa pipeladim.
Sonuc:
Simdi gelelim soru hakkindaki dusuncelerime. Bir onceki soruya kiyasla gercekten cok ama cok daha kolaydi. Onun disinda herkesin Protostari kendisi denemesini siddetle tavsiye ediyorum. Baslangic duzeyine hitap ettigi icin her bir soru en fazla 20 dakikanizi alacak sekilde hazirlanmis. Bunun yaninda basit assembly yorumlamayi ogreniyorsunuz. Tabiiki network, socket kisminda bizi ne bekliyor bilmesem de, egleneceginizin garantisini veriyorum.
Yararli Linkler
Hemen hizli bir sekilde bizden istenilen soru ile baslayalim:
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)
{
char buffer[64];
gets(buffer);
}
Sorunun cozumu icin iki farkli yol izlenebiliyor. Ikiside gayet basit.
Lakin ben biraz daha uzun olani izleyecegim cunku digerine gore anlasilabilirligi daha yuksek.
Ek olarak stack0-2 araliginda belirttigim bazi komut ve tanimlari hatirlamaniz gerekebilir.
Cozume gecelim. Yine her zamanki gibi, gdb yi acip assembly flawor'i intel yaptim. Maini disassembleladim.
- Stack Pointerin icerisi
- Base Pointerin saveledigi memory adresi
Daha sonra break point atiyoruz. Ben burada once fonksiyonun cagirildigi yeri breaklemistim ama esp'nin icinde isime yarayacak bisey bulamayinca leave komutuna break attim.
Bu sekilde gets() fonksiyonu calisip isini bitirdikten sonraki stack icerigini gozlemleyebilecektim.
Gecen seferkinin aksine isler bu defa yolunda gitti. Stack pointerini checkliyorum.
Resimden de goreceginiz uzere, input olarak her zamanki 'print "A"*64 + "BBBB"
gondermistim. Stack icerisindeki 0x414141 ler AAAA lari 42 ler ise BBBB yi temsil ediyor.
Normalde eip BBBB nin oldugu yerden islem yapiyordu. Ama bu defa devaminda 0x00 ve iki base pointer degeri var. Ikisinin base pointer degeri oldugunu altta 'x/2x $ebp' ile kontrol ettigim icin biliyorum. Simdi bu degerlerden hangisi degerleri stack'e kaydedecek onu denemek lazim. Ilk olarak 0xbff'liyi denedim ama istedigim sonucu vermedi.
Onemli: memory noktasinda gordugunuz her 0x0 li deger icin bit hesabi yaparak inputlari gonderiyorum. her deger 4 bit. yani gondereceginiz input degerini 4'er sekilde arttirmaniz gerekiyor. ilk basta gonderdigimiz 64 ve + 4 "BBBB" vardi yani 68. 0xbff icin 72 gondermeniz gerekmekte.
0xbff li calismadigi icin diger degeri denedim. Onada input olarak "print 'A'*76 + 'BBBB'" gonderip denedim. Istedigimi aldim.
Aradagim memory noktasina ulasabildigim icin, geriye kalan tek sey scriptte win() fonksiyonun lokasyonunu iletmek kaliyordu. Onuda :
Kod:
pad = "A"*72 + "BBBB" # siz burada direk print"A"*76 da kullanabilirisniz. Ben sadece yazdigim degerleri memoryde farkli farkli gormekten hoslaniyorum
var = "\xf4\x83\x04\x08"
print test+var
Sonuc:
Simdi gelelim soru hakkindaki dusuncelerime. Bir onceki soruya kiyasla gercekten cok ama cok daha kolaydi. Onun disinda herkesin Protostari kendisi denemesini siddetle tavsiye ediyorum. Baslangic duzeyine hitap ettigi icin her bir soru en fazla 20 dakikanizi alacak sekilde hazirlanmis. Bunun yaninda basit assembly yorumlamayi ogreniyorsunuz. Tabiiki network, socket kisminda bizi ne bekliyor bilmesem de, egleneceginizin garantisini veriyorum.