当前位置: 首页 > 后端技术 > Python

LyScript插件实现UPX查找入口

时间:2023-03-25 21:39:45 Python

LyScript插件可以实现压缩壳的快速解包操作。目前支持两种解包方式,一种是使用API??接口自己编写解包流程,另一种是直接加载已有的shell脚本运行shell。插件地址:https://github.com/lyshark/Ly...首先准备一个带有UPX压缩壳的程序,然后我们通过编写自己的脚本来完成解包任务。我们将当前EIP留在UPXshell的首地址,执行以下脚本自动查找当前EIP的具体位置。fromLyScript32importMyDebugif__name__=="__main__":#初始化dbg=MyDebug()#连接调试器connect_flag=dbg.connect()print("Connectionstatus:{}".format(connect_flag))#检测socket是否还在ref=dbg.is_connect()print("Isitconnecting:",ref)is_64=False#判断是否为64位时ifis_64==False:currentIP=dbg.get_register("eip")ifdbg.read_memory_word(currentIP)!=int(0xBE60):print("[-]可能不是UPX")dbg.close()patternAddr=dbg.scan_memory_one("83EC??E9??????00")打印("匹配地址:{}".format(hex(patternAddr)))dbg.set_breakpoint(patternAddr)dbg.set_debug("Run")dbg.set_debug("Wait")dbg.delete_breakpoint(patternAddr)dbg.set_debug("StepOver")dbg.set_debug("StepOver")print("[+]ProgramOEP=0x{:x}".format(dbg.get_register("eip")))else:currentIP=dbg.get_register("rip")ifdbg.read_memory_dword(currentIP)!=int(0x55575653):print("[-]可能不是UPX")dbg.close()patternAddr=dbg.scan_memory_one("4883EC??E9")print("匹配地址:{}".format(hex(patternAddr)))dbg.set_breakpoint(patternAddr)dbg.set_debug("Run")dbg.set_debug("等待")dbg.delete_breakpoint(patternAddr)dbg.set_debug("StepOver")dbg.set_debug("StepOver")print("[+]ProgramOEP=0x{:x}".format(dbg.get_register("eip")))dbg.close()运行上面的代码,通过签名快速定位找到程序打包前的OEP位置,另一种方式是直接找到原生的解包脚本,使用LyScript加载执行解包,如下是一个原生的解包脚本,我们保存在磁盘中。bphc//清除所有硬件断点sti//执行一次F8(stepover)bphesp,r,1//读取当前Esp栈顶下硬件上的断点,设置一个字节r表示读取erun//执行一旦F9运行,erun中途出现异常,交给调试器执行findeip,e9,1000//使用Find函数在EIP位置查找jmp,查找内存大小为1000bphcbph$result//搜索到的结果会被放入$result变量中erun//执行bphcsto2//执行F7cmteip,"CurrentEipisOepPleaseDumpEntry"//在EIP位置ret填写注释,然后载入x64dbg脚本引擎通过LyScript插件,直接运行。fromLyScript32importMyDebugif__name__=="__main__":#初始化dbg=MyDebug()#连接调试器connect_flag=dbg.connect()print("Connectionstatus:{}".format(connect_flag))#检测socket是否还在ref=dbg.is_connect()print("Isitconnecting:",ref)#加载并运行脚本dbg.script_loader("d://script.txt")dbg.script_run()dbg.close()正确的OEP位置也可以找到。此时直接在OEP位置进行内存转储即可完成解包。