Exploit-Exercises Protostar Stack3 <kondanta>

kondanta

Katılımcı Üye
29 Tem 2017
910
0
CNCF
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.
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
yazarak elde ettik.
jW9WVn.png

Artik disassemblera gecebilriiz:
N1z1EO.png
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.

1g8gJB.png

Gecen orneklerden de oldugu uzere ezberden bir input verdim. Scriptin icerigi:
Kod:
print "A"*65 + "BBBB"
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.

Ak9k8r.png

Daha sonra scripti bu sekilde degistirip tekrar "python stack3.py > text" ile test dosyasina pipeladim.


Ve sonunda sonuca su sekilde ulastim ulastim.
1g8gb1.png


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:
Ü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.