<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
ROP繞過片段簡單科普一下,你可以理解成一個可以關閉系統自身記憶體保護的一段機器指令,這段程式碼需要我們自己構造,這就涉及到在對端記憶體搜尋這樣的指令,LyScript外掛增強了指令片段的查詢功能,但需要我們在LyScript外掛基礎上封裝一些方法,實現起來也不難。
LScript專案地址:https://github.com/lyshark/LyScript
封裝機器碼獲取功能: 首先封裝一個方法,當用戶傳入指定組合指令的時候,自動的將其轉換成對應的機器碼,這是為搜尋ROP片段做鋪墊的,程式碼很簡單,首先dbg.create_alloc(1024)
在程序記憶體中開闢堆空間,用於存放我們的機器碼,然後呼叫dbg.assemble_write_memory(alloc_address,"sub esp,10")
將一條組合指令變成機器碼寫到對端記憶體,然後再op = dbg.read_memory_byte(alloc_address + index)
依次將其讀取出來即可。
from LyScript32 import MyDebug # 傳入組合指令,獲取該指令的機器碼 def get_assembly_machine_code(dbg,asm): pass if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) machine_code_list = [] # 開闢堆空間 alloc_address = dbg.create_alloc(1024) print("分配堆: {}".format(hex(alloc_address))) # 得到組合機器碼 machine_code = dbg.assemble_write_memory(alloc_address,"sub esp,10") if machine_code == False: dbg.delete_alloc(alloc_address) # 得到組合指令長度 machine_code_size = dbg.assemble_code_size("sub esp,10") if machine_code == False: dbg.delete_alloc(alloc_address) # 讀取機器碼 for index in range(0,machine_code_size): op = dbg.read_memory_byte(alloc_address + index) machine_code_list.append(op) # 釋放堆空間 dbg.delete_alloc(alloc_address) # 輸出機器碼 print(machine_code_list) dbg.close()
我們繼續封裝如上方法,封裝成一個可以直接使用的get_assembly_machine_code
函數。
from LyScript32 import MyDebug # 傳入組合指令,獲取該指令的機器碼 def get_assembly_machine_code(dbg,asm): machine_code_list = [] # 開闢堆空間 alloc_address = dbg.create_alloc(1024) print("分配堆: {}".format(hex(alloc_address))) # 得到組合機器碼 machine_code = dbg.assemble_write_memory(alloc_address,asm) if machine_code == False: dbg.delete_alloc(alloc_address) # 得到組合指令長度 machine_code_size = dbg.assemble_code_size(asm) if machine_code == False: dbg.delete_alloc(alloc_address) # 讀取機器碼 for index in range(0,machine_code_size): op = dbg.read_memory_byte(alloc_address + index) machine_code_list.append(op) # 釋放堆空間 dbg.delete_alloc(alloc_address) return machine_code_list if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) # 轉換第一對 opcode = get_assembly_machine_code(dbg,"mov eax,1") for index in opcode: print("0x{:02X} ".format(index),end="") print() # 轉換第二對 opcode = get_assembly_machine_code(dbg,"sub esp,10") for index in opcode: print("0x{:02X} ".format(index),end="") print() dbg.close()
執行後即可得到結果:
掃描符合條件的記憶體: 通過使用上方封裝的get_assembly_machine_code()
並配合scan_memory_one(scan_string)
函數,在對端記憶體搜尋是否存在符合條件的指令。
from LyScript32 import MyDebug # 傳入組合指令,獲取該指令的機器碼 def get_assembly_machine_code(dbg,asm): machine_code_list = [] # 開闢堆空間 alloc_address = dbg.create_alloc(1024) print("分配堆: {}".format(hex(alloc_address))) # 得到組合機器碼 machine_code = dbg.assemble_write_memory(alloc_address,asm) if machine_code == False: dbg.delete_alloc(alloc_address) # 得到組合指令長度 machine_code_size = dbg.assemble_code_size(asm) if machine_code == False: dbg.delete_alloc(alloc_address) # 讀取機器碼 for index in range(0,machine_code_size): op = dbg.read_memory_byte(alloc_address + index) machine_code_list.append(op) # 釋放堆空間 dbg.delete_alloc(alloc_address) return machine_code_list if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) # 轉換成列表 opcode = get_assembly_machine_code(dbg,"push eax") print("得到機器碼列表: ",opcode) # 列表轉換成字串 scan_string = " ".join([str(_) for _ in opcode]) print("搜尋機器碼字串: ", scan_string) address = dbg.scan_memory_one(scan_string) print("第一個符合條件的記憶體塊: {}".format(hex(address))) dbg.close()
掃描結果如下:
將我們需要搜尋的ROP指令集片段放到陣列內直接搜尋,即可直接返回ROP記憶體地址。
from LyScript32 import MyDebug # 傳入組合指令,獲取該指令的機器碼 def get_assembly_machine_code(dbg,asm): machine_code_list = [] # 開闢堆空間 alloc_address = dbg.create_alloc(1024) print("分配堆: {}".format(hex(alloc_address))) # 得到組合機器碼 machine_code = dbg.assemble_write_memory(alloc_address,asm) if machine_code == False: dbg.delete_alloc(alloc_address) # 得到組合指令長度 machine_code_size = dbg.assemble_code_size(asm) if machine_code == False: dbg.delete_alloc(alloc_address) # 讀取機器碼 for index in range(0,machine_code_size): op = dbg.read_memory_byte(alloc_address + index) machine_code_list.append(op) # 釋放堆空間 dbg.delete_alloc(alloc_address) return machine_code_list if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) for item in ["push eax","mov eax,1","jmp eax","pop eax"]: # 轉換成列表 opcode = get_assembly_machine_code(dbg,item) #print("得到機器碼列表: ",opcode) # 列表轉換成字串 scan_string = " ".join([str(_) for _ in opcode]) #print("搜尋機器碼字串: ", scan_string) address = dbg.scan_memory_one(scan_string) print("第一個符合條件的記憶體塊: {}".format(hex(address))) dbg.close()
檢索效果如下:
到此這篇關於LyScript尋找ROP漏洞指令片段的方法詳解的文章就介紹到這了,更多相關LyScript ROP漏洞指令片段內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45