try: rsp = current_arch.sp nowpc = self.findAddr or current_arch.pc except gdb.error as e: err("%s Please start first."%e) return bit = current_arch.ptrsize print(f"current_arch.ptrsize={current_arch.ptrsize}") if current_arch.arch == "X86": arg0 = "$rdi"if bit == 8else"$ebx" arg1 = "$rsi"if bit == 8else"$ecx" arg2 = "$rdx"if bit == 8else"$edx" sysreg = current_arch.syscall_register sysreg_value = 59if bit == 8else11 syscall_instr = 0x050Fif bit == 8else0x80CD else: err("%s can't implementation." % current_arch.arch) return spc = nowpc & (~0xFFF) res = gdb.execute("find /h %s,%s,%s"%(spc, spc+0x10000, syscall_instr), to_string=True) print(f"syscall addr={res}") if"patterns found."notin res: err("can't find syscall. Please break in libc.") return newpc = res.splitlines()[0].split(' ')[0] print(f"newpc addr={newpc}") endian_symbol = endian_str() endian = "little"if endian_symbol == "<"else"big" print(f"endian_symbol={endian_symbol}") startaddr = rsp + 0x100 args_list = [] # cmd write to stack for cstr in cmd: args_list.append(startaddr) cstr += b"\x00" * (4 - (len(cstr) % 4)) length = len(cstr) #print(f"i am here~~~{cstr}") write_memory(startaddr, cstr, length) startaddr += length # for i in range(0, len(cstr), 4): # t = hex(struct.unpack(endian_symbol+'I', cstr[i:i+4])[0]) # dofunc("set *(%s)=%s"%(hex(startaddr), t)) # startaddr += 4 args_list.append(0) # set cmd point (rsi) rsiAddr = rsp + 0x50 addrvalue = b"" for addr in args_list: addrvalue += addr.to_bytes(bit, endian)
write_memory(rsiAddr, addrvalue, len(addrvalue)) # for i in range(0, len(addr), 4): # t = hex(struct.unpack(endian_symbol+'I', addr[i:i+4])[0]) # dofunc("set *(%s+%d)=%s"%(hex(rsiAddr), i, t)) # rsiAddr += bit
# set first arguments. dofunc("set %s=%s"%(arg0, hex(args_list[0]))) # set second arguments dofunc("set %s=%s"%(arg1, hex(rsp + 0x50))) # set third arguments dofunc("set %s=0"%arg2) # set syscall register print(f"i am here now~~~") dofunc("set %s=%s"%(sysreg, sysreg_value)) # set $pc=$sp print(f"i am here~~~{newpc}") dofunc("set $pc=%s"%newpc) print(f"i am here~~~") # set *$pc # dofunc("set *(int *)$pc=%s"%hex(syscall_instr)) # show context # dofunc("context") # continue dofunc("c") return