

就是写入shellcode跑就行。但是shellcode不能有小于’\x1f’,也不能有等于‘\x7f’。问题的关键在于开了沙箱。
只能使用这些系统调用。
orw只有r,怎么处理。
首先看o,我们发现给了系统调用5,这个系统调用在64的时候是fstat,但是在32模式情况下就是open,所以我们首先考虑使用retfq汇编语句来让我们的整个模式跳到32位,在32位下去调用系统调用5就可以获得open。
retfq使用的时候要注意,cs寄存器中存储的一个数字,0x23表示32位,0x33表示64位。调用retfq之后esp是cs寄存器值,esp+8就是返回地址了。
但是我们发现,我们把32位shellcode读到栈上以后栈的整个环境是64的,就会产生矛盾,所以我们需要一块全新的地方来写入我们的32位shellcode。
我们看到了系统调用可以mmap,所以我们第一步就是mmap申请一块地方,然后read32位shellcode过去。这里说一嘴因为syscall的汇编代码被ban了,所以我们写汇编语句的时候要耍点小手段,通过xor来得到syscall。
此时我们要读入shellcode到mmap,这个时候对我们的字符不会有检查,就随便写了。我们首先open打开文件,然后跳回64位,把读flag读出来,然后呢,没有write。
所以我们参考了2021蓝帽杯的silent,我们爆破,将每个可见字符拿去跟我们的flag进行比较,假如命中,我们让它跳入loop循环,假如我们程序卡在那里,说明命中了,然后一个字符一个字符爆破,得到flag。
下面的flag我自己写的,爆破大概爆了十分钟吧。

exp
#coding:utf-8
from pwn import *
context.log_level = 'debug'
append_x86 = '''
push ebx
pop ebx
'''
shellcode_x86 = '''
/*fp = open("flag")*/
mov esp,0x40404140
push 0x67616c66
push esp
pop ebx
xor ecx,ecx
mov eax,5
int 0x80
mov ecx,eax
'''
shellcode_flag = '''
push 0x33
push 0x40404089
retfq
'''
shellcode_x86

本文介绍了如何在存在沙箱和特定字符限制的环境中编写shellcode,利用retfq指令切换到32位模式,通过mmap分配内存,再read加载32位shellcode。然后通过爆破方法逐字符获取flag。详细讲解了shellcode的构造过程,包括open、read等系统调用的使用,并展示了实际的exploit代码。
最低0.47元/天 解锁文章
1695

被折叠的 条评论
为什么被折叠?



