대학생들을 위한 IT

쉘코드 :: 이커시 본문

악성코드

쉘코드 :: 이커시

phantomik 2019. 1. 15. 03:33

쉘코드

컴퓨터 보안에서 쉘코드(Shellcode)란 작은 크기의 코드로 소프트웨어 취약점 이용을 위한 내용부에 사용된다.
쉘코드로 불리는 까닭은 일반적으로 명령 쉘을 시작시켜 그곳으로부터 공격자가 영향 받은 컴퓨터를 제어하기 때문이다.
쉘코드는 일반적으로 어셈블리어로 작성되고 기계어로 변경된다. 비슷한 작업을 하는 어떤 코드 조각이라도 쉘코드라고 불릴 수 있다. -위키백과-

이번 포스팅에서는 완벽한 쉘코드가 아닌 쉘코드인 척 하는 그런 작업을 할 예정이다. 이걸 발전시키면 그게 쉘코드지 모~

후에 포스팅 할 쉘코드를 위한 연습용이라고 알려둔다!

더욱더 중요한 점은 필자가 다루어 볼 BOF - STACK 의 보호 기법 중 하나인 GS(STACK GUARD)를 피하기 위해 전제 조건으로 버퍼 보안 검사 수준을 [아니요] 로 설정한다.

BOF 공격 전제조건



소스코드

먼저 간단한 프로그램을 짜보았다. (단순하게 .txt 파일을 실행시켰을 경우 최대 11글자(널 값 포함 12) 출력이 가능한 프로그램)

Immunity Debugger 실행을 위해 'release'모드로 디버깅 한다.


대략 이런 느낌의 허접한 프로그램이다.

TxT Reader 실행화면


"----TxT Reader !!----" 부분에 표시해 줄 .txt 파일을 만들어 Immunity 실행 할 때 같이 실행시킨다.

abc.txt 파일 같이 열기

Immunity Debugger를 실행시키고 가장 먼저 메인 함수를 찾아 간다! (Immunity Debugger 사용법도 차후 올리도록 하겠다.)

C코드의 아래 부분이다.

int main( int argc, char *argv[]){

   char buf[MAX_LENGTH] = {0,}; // = "\0";

   FILE *fd;

   if( argc < 2 ) exit(0);

   fd = fopen( argv[1], "r" );

   size_t result = fread( buf, 1, 1024, fd); // fd 파일 핸들

   buf[result]='\0';

   fclose(fd);

   printf("----TxT Reader !!----\n");

   printf("%s\n",buf);

   return 0;

}


메인함수1

이번 포스팅의 목적 부분에 왔다. 목적은 [0040107E] 리턴을 실행 시키면 '지뢰찾기'가 실행되도록 수정하는 것이다.

그럼 먼저 지뢰찾기를 찾기 위해 지뢰찾기의 메모리 주소를 알아야 한다. 이를 알아내기 위해 간단한 지뢰찾기 실행 소스코드를 살펴보자.

#include<stdio.h>

#include<windows.h>

void main()

{

   WinExec("winmine.exe",SW_SHOW);

}

리얼 초간단 소스코드

이 역시 Release모드로 디버깅 해서 Immunity Debugger로 확인해보자.

가장 먼저 메인 함수 부분을 찾고 

지뢰찾기 Immunity Debugger

메모리 주소 "00401007" 부분 CALL 인자가 굉장히 자기에게로 와달라고 애원하는 것 같다. "00401007" 부분에서
F7 Step into(한 단계씩 실행)을 눌러보자! (F8 : Step over, F9 : 걍 실행)

7C8623AD

메모리 주소 [7C8623AD]이 WinExec 부분이란 걸 알아낼 수 있다. 이제 다시 [addd.exe] 메인 함수로 돌아가보자!

스택부분에 변화를 주어 스택값을 읽어들어와서 필자가 원하는 곳으로 보내 프로그램을 실행하게 한다!

메인함수 리턴값 부분의 스택 수정 전

스택 수정 후

복귀 값을 WinExec가 있는 커널 부분으로 메모리 주소를 조작한 후 스택 값이 [0012FF88]부분 아래로 실행하게 끔 유도 한다.

cf. [0012FF88]의 [0012FF90]의 값은 스택 주소 [0012FF90]을 뜻함

그리고 다시 커널부분의 작업이 끝나면 본래 복귀 값인 [004011D1](메모리 주소 : 0012FF84)으로 조작한다.

조작 후 F9를 눌러 바로 [winmine.exe]를 실행시키러 가보자!

결과화면

스택부분을 수정부분을 보기 쉽게 정리하였다.


calc.exe 부분(636C6163, 6578652E)을 지뢰찾기인 경우, 6D6E6977, 2E656E69, 00657865 로 바꾸어주면 된다.

이제 수정한 스택부분을 Hxd로 재편집하여 프로그램을 실행하면 바로 지뢰찾기가 실행되도록 구현하고 포스팅을 마치겠다.

att1.txt

addd.exe를 Immunity Debugger에서 열 때 Arguments 부분에 att1.txt를 같이 실행시키면 끝!

이번 포스팅은 쉘코드를 하기 위한 연습용 포스팅이며, 이 연습용의 문제점은 필자가 원하는 방향으로 이동루트를 바꾸어 딱 한번만 실행 가능하게끔 만든 것이다. 하지만 후에 포스팅할 쉘코드는 이러지 않다는 점을 말해둔다.

'악성코드' 카테고리의 다른 글

쉘코드4-1 :: 이커시  (1) 2019.01.20
쉘코드4 :: 이커시  (0) 2019.01.20
쉘코드3-1 :: 이커시 (Trampoline)  (0) 2019.01.18
쉘코드3 :: 이커시  (0) 2019.01.17
쉘코드2 :: 이커시  (1) 2019.01.16
Comments