Shellcode
- shellcode란 , 명령 shell을 실행시켜 공격자가 해당 시스템을 제어하는 코드다.
- machine code로 작성된 작은 크기의 프로그램으로 일반적으로 어셈블리어로 작성후 기계어로 변경된다.
Shellcode를 개발하기 위해서는 다음과 같은 지식을 필요로 한다.
- 우리가 주로 사용하는 많은 프로그램들은 대부분 C언어와 같은 High-level의 언어를 컴파일 과정에 의해
Assembly , Machine Language 등과 같은 저수준 언어로 변경된 파일이다.
(C code는 해당 시스템에 맞는 Assembly Code로 변환 -> 변환된 Assembly code를 Machine code로 표현 )
- 위와 같은 방식으로 Machine code는 메모리에 로드되어 코드를 실행하게 된다.
즉 , 공격자는 해당 프로그램의 취약점을 이용하여 shell을 획득하기 위해서는 direct한 contact을 위하여 low-level의 언어로 개발된 코드가 필요하다.
- 즉 , Shellcode는 Assembly , Machine-Language같은 저수준 언어로 개발되어야 한다.
High-level 언어와 Low-level언어 사이에는 어떠한 관계가 있는지를 눈으로 보기 위하여 C언어를 Assembly code로 바꿔보자.
C Code
해당 C code를 gcc를 통하여 컴파일 후 gdb를 통하여 디버깅 한 결과
이와같이 C언어와 Assembly code는 relation을 갖고 있음을 확인할 수 있다.
우리는 Assembly code를 마음대로 주무르진 못하더라도 흐름을 파악할 수 있는 능력이 필요하다.
Assembly code에서 주로 쓰이는 Instruction에 대해 알아보자.
Instruction |
Meaning |
mov dest , src |
명령어 이름 그대로 출발지의 value를 도착지에 복사한다. |
push value |
stack value 값을 저장한다. |
pop register |
stack 상단에 위치하는 값을 레지스터에 저장한다. |
call addr |
해당 명령 실행 후 리턴을 위해 call 명령어 다음 명령주소를 스택에 저장한 후 , 함수를 실행시키기 위하여 해당 addr로 점프한다. |
ret |
스택으로 부터 리턴 주소를 pop하고 그 곳으로 점프하여 함수에서 리턴한다. |
inc dest |
dest 피연산자를 1 증가 시킨다 . ( increase ) |
dec dest |
dest 피연산자를 1 감소 시킨다 . ( decrease ) |
add dest , value |
dest 피연산자에 value 값을 더한다. |
sub dest , value |
dest 피연산자에 value 값을 뺀다. |
or dest, value |
dest 피연산자 값과 value값을 OR 연산한다. |
and dest , value |
dest 피연산자 값과 value값을 AND 연산한다. |
xor dest, value |
dest 피연산자 값과 value값을 XOR 연산한다. 연산의 결과는 dest에 저장된다. |
lea dest, src |
dest에 src 피연산자의 유효 주소를 로드한다. |
'Hacking & Security > Exploit' 카테고리의 다른 글
diff 32bit vs 64bit (0) | 2019.11.20 |
---|---|
Return To Libc ( RTL ) (0) | 2018.12.29 |
Return to Shellcode (0) | 2018.12.27 |
BOF 기초문서 (0) | 2018.11.03 |