极客大挑战_2019-Not_Bad
典型的ORW+mmap参数理解
知识点
1.典型的沙箱,ORW
2.mmap参数的理解,参考这篇文章
1.ida速览
- 已经修改了函数名,加入了沙箱
- 发现是典型的ORW可用:
- 查看一下主要部分:
存在明显的栈溢出,并且此题保护全关,可以直接写入shellcode。
简单思路
- 关于mmap函数的参数可以参考开头的文章,此处的mmap会在指定的地址开辟一个0x1000的可写可执行区域(prot=6,不可读),因此我们可以在该地址写入shellcode,然后使之被调用就可以getflag。
- 具体的构造看下面吧:
2.完整分析
1 | # 可以先将已知的和需要的先构建出来 |
- 这里要解释一下read的第一个参数的含义,代表我要读的文件是第几个,即fd,所谓的3是因为
1 | 0 : stdin |
- shellcode是构造完了,但是这个shellcode的长度有0x52,能直接写吗?当然不行,栈空间不够啊,那要如何完成呢?
- 我们可以在栈开头调用一个read,再将这个shellcode输入到mmap的地址,最后改变rax为mmap地址,再call就好了,那么初始的构造就如下了:
1 | payload = asm(shellcraft.read(0,mmap,0x100)) + asm("mov rax,0x123000;call rax") |
- 这样我们就构造好了开始的结构,只要调用这个,再次输入shellcode,就可以getflag了,如何调用?可以参考我之前写的这篇博客
- 我们只需要将ret_address改为jmp_rsp的地址,此时ret相当于执行pop rip,将rsp的值弹给rip,那么此时的rip就是jmp_rsp,同时,也由于pop rip中的pop,导致rsp+8,此时rsp指向下一条语句,即”sub rsp;0x30;jmp rsp”,rip此时jmp_rsp,相当于执行这段语句,那么便会执行栈开头的系统调用了
1 | payload += p64(jmp_rsp) + asm("sub rsp,0x30;jmp rsp") # jmp_rsp为地址 |
3.完整EXP:
1 | from pwn import * |
- 标题: 极客大挑战_2019-Not_Bad
- 作者: D0wnBe@t
- 创建于 : 2024-09-16 15:43:19
- 更新于 : 2024-11-14 11:41:55
- 链接: http://downbeat.top/2024/09/16/极客大挑战-2019-Not-Bad/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论