Buffer Overflow

Immunity Debugger: https://www.immunityinc.com/products/debugger

Mona: https://github.com/corelan/mona

Fuzzing

İlk adım olarak aşağıdaki kod ile hangi aralıkta kodun çökütünü buluyoruz.

import socket, time, sys

ip = "<IP>"

port = <PORT>
timeout = 5
prefix = "OVERFLOW1 "

string = prefix + "A" * 100

while True:
  try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
      s.settimeout(timeout)
      s.connect((ip, port))
      s.recv(1024)
      print("Fuzzing with {} bytes".format(len(string) - len(prefix)))
      s.send(bytes(string, "latin-1"))
      s.recv(1024)
  except:
    print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix)))
    sys.exit(0)
  string += 100 * "A"
  time.sleep(1)

Finding Crash Point

Kodun çöktüğü uzunluğu bulduğumuza göre tam olarak hangi adreste crash verdiğini bulmalıyız. Alttaki komut ile bir payload oluşturuyoruz.

Oluşan payload'u yerleştiriyoruz ve kodu çalıştırıyoruz.

Debugger aracına aşağıdaki komutu giriyoruz ve EIP kısmında crash veren tam adresi buluyoruz.

Test etmek için retn kısmına "BBBB" gönderiyoruz. Bu kodu çalıştırdığımızda EIP Register 424242 olmalı.

Finding Bad Characters

Aşağıdaki kod ile bütün karakterleri gönderiyoruz.

Program crash verdiğimde aşağıdaki komut ile bad characterleri buluyoruz.

Bulduğumuz karakterler ile yeni bir bytearray oluşturuyoruz. Aynı zamanda payload'umuzdan bu karakterleri çıkartıyoruz.

Program bir daha crash verdikten sonra aşağıdaki komutu çalıştırıyoruz. Eğer hiçbir bad character bulmuyorsa doğru yoldayız.

Jump Point

Program crash halindeyken aşağıdaki komut ile atlayabileceğimiz adresleri buluyoruz.

Adreslerden rastgele birini seçin ve ters çevirerek koddaki retn kısmına yazın.

Sonrasında reverse shell için bir payload oluşturalım. b parametresine bad characterleri yazalım

Aşağıdaki koda payload kısmını yazıyoruz ve kodu çalıştırıyoruz. Eğer her şey doğru ise netcat ile reverse shell alabiliriz.

Last updated