Stack Based Overflows #5

BLIND RETURN

Simge Karahan
4 min readDec 28, 2020

JMP ESP konusunda incelediğimiz ESP’ye atlama olayını, bu yazıda başka bir atlama yolu olan blind return olarak inceleyeceğiz. ESP’ye neden atlamak istediğimizi önceki yazılarda açıklamıştık, o yüzden direkt konuya geçiyorum.

Blind Return Adımları:

  • EIP’e ret komutunu gösteren bir instruction yazılır.
  • ESP’nin ilk 4 baytına shellcode hardcode şeklinde yazılır.
  • ret komutu çalıştığında Stack’e son yazılan 4 bayt alınıp EIP’e yazılır.
  • Ve shellcode’a jump yapılmış olur.

[26074 tane A][ret adresi][0x000ff730][shellcode] şeklinde bir dizilimle shellcode’a ulaşılır:

  • 26074 tane A ile taşmaya sebep oluyoruz.
  • Ret adresi EIP’e yazılan adrestir.
  • 0x000ff730 adresi ESP’nin gösterdiği adrestir. Ret bu adresi popluyor (yani Stackten çekiyor) ve bu sayede yazılan shellcode çalıştırılıyor.

Önceki yazılarda verilen örneklerde, bellekte hep overwrite işleminden sonra bir yerlerde shellcode yazmıştık. Varsayalım ki burada shellcode yazılacak kadar yeterli alan yok. O zaman overwrite etmek için doldurduğumuz A’ların içinde bir alanı shellcode yazmak için kullanabiliriz. Ve normalde shellcode yazdığımız ve şuan az yer olduğunu varsaydığımız yere de A’ların içine yazdığımız shellcode’un başlangıç adresini yazabiliriz. Böylece shellcode’un da içinde olduğu A’larla birlikte overwrite işlemi yapmış ve gösterdiğimiz adres sayesinde de shellcode’a ulaşmış oluruz.

Shellcode’u A’ların Arasına Yazmanın Ve Buraya Atlamanın Yolu

Bu yol için, ESP’de gösterilen A’ların gerçek adresi nerede başlıyor? İşte bu adrese ihtiyacımız var. Shellcode’u A’ların içine koymak için tam olarak yerini bulmalıyız. Önceki yazılarda da sürekli incelediğimiz temel koda bakalım:

Preshellcode 4 baytlık bir alan, bu 4 bayt ve ESP için yazılan 50 bayt birlikte 54 olarak yazıldı. Sonucu incelediğimizde (aşağıdaki görsel) ESP’de 50 tane X’i görebiliyoruz. Shellcode için kullanabileceğimiz tek alanın burası olduğunu varsayalım. Stack’e baktığımızda 000ff849 adresinde yani (ESP+281) A’ları bulabiliriz:

Buradaki 50 baytlık X’lerin olduğu yeri shellcode’un adresini belirtmek için kullanacağız. jumpcode komutu X’lerden A’lara atlayacak komuttur.

Özel olarak konum bulmak için Pattern kullanımını incelemiştik. Aynı şekilde boyutunu 1000 karaktere ayarlayarak bir pattern oluşturup kullanalım.

1000 karakterlik bir pattern kullanacağımıza göre başlangıçta 26074 tane olan A harfinden artık 25074 tane kullanacağız.

Kodu verdiğimizde sonuç:

Metasploit pattern offset aracılığıyla “5Ai6" karakterlerinin 257'de olduğunu bulabiliriz. Dolayısıyla 26074 A koymak yerine 257 tane A koyup ardından shellcode koymamız gerekiyor. 26074 karakterden geri kalanını yine A ile dolduracağız. Araya NOP eklemekte fayda var, bu yüzden 250 tane A ve ardından 50 NOP ile başlayalım, sonra shellcode ve A’ların devamı ile dolduracağız. Bu şekilde çok spesifik bir şekilde atlamama yapmamıza gerek yok, NOP bize yardım edecek. Başarılı bir şekilde çalışmayı sağlayacak.

000ff848'den başlayan 50 tane NOP ve ardından A’lar var, istediğimiz sonucu elde ettik:

Yapmamız gereken ikinci şey, ESP’ye yerleştirilmesi gereken atlama kodunu oluşturmaktır. Jumpcode’un amacı ESP+281'e yani 000ff849 adresine atlamaktır. NOP kullandığımız için biraz esnekliğimiz var, bu yüzden çok da kesin olmak zorunda değiliz. Yani 281 veya daha fazlasını da gösterdiğimiz durumda işe yarayacaktır.

Atlama kodu için 50 baytımız (varsaydığımız durum) var. Atlama komutu için ESP’ye 3 kez 0x5e(94) ekleyelim. (94x3=282 olduğu için) Sonra ESP’ye atlama işlemi yapalım. Şu şekilde:

add esp,0x5e
add esp,0x5e
add esp,0x5e
jmp esp

Windbg kullanarak opcode bulabiliriz:

0x83,0xc4,0x5e
0x83,0xc4,0x5e
0x83,0xc4,0x5e
0xff,0xe4

Jumpcode, ESP’ye yerleştirilir ve shellcode çağırıldığında ESP, NOP’ları işaret eder (000ff842 ile000ff873 arasında). Shellcode 000ff874'te başlar:

Yapmamız gereken son şey, jmp esp ile EIP’in üzere yazmaktır. Hatırlarsanız önceki yazılarda dll içerisinde jmp esp komutunun 0x01aaf23a adresiyle gerçekleştiğini bulmuştuk.

Taşma meydana geldiğinde ne olacak?

  • Gerçek shellcode gönderilen dizenin ilk kısmına yerleştirilecek ve ESP+300 adresinde sona erecek.
  • Gerçek shellcode’un başına atlamanın biraz uzaklaşması için NOP’lar eklenir.
  • EIP’in üzerine 0x01aaf23a yazılacak, bu adres bir dll’i gösterecek ve jmp esp çalışacak.
  • EIP’in üzerine yazıldıktan sonra ESP’ye 282 ekleyen ve ardından bu adrese atlamayı sağlayan atlama kodu yazılacak
  • Payload gönderildikten sonra EIP, ESP’Ye atlayacak ve bu atlama kodu ESP+282'ye atlamayı tetikleyedek. Orada da shellcode bulunduğu için istediğimiz olacak, yani shellcode çalıştırılacak.

EIP=0x000ff874=shellcode başlangıç adresi

0x000ff874 adresinde CC komutunu görüyoruz, çünkü shellcode olarak bir interrupt gerçekleştirdik. Bu interrupt komutu yerine hangi komutları yazarsak, o işlemler gerçekleşecek.

Böylece shellcode çalıştırmak için ulaşmamız gerek yere nasıl gidebileceğimizi incelemiş olduk.

--

--