ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스피어피싱] 11강 쉘코드 디버깅 분석 - 쉘코드 문자열
    보안/스피어피싱 2024. 9. 3. 17:13

    1. 실습

    String 툴 이용

     

    String 결과값 1

     

    Strings 결과값 2

     

    Strings 툴을 이용해 쉘코드 내 존재하는 길이가 3보다 긴 문자열들을 추출하여 쉘코드가 어떤 동작을 하는 지 유추한다.

     

    이후 scdbg.exe 툴을 이용하여 해당 쉘코드를 실제로 에뮬레이트 한다.

     

    scdbg.exe

     

    여기서 주의 해야할 점이 있다.

     

    • scdbg.exe는 만능이 아니다.
      • 쉘코드에는 실행되기 위한 조건이 붙는다. 보통 쉘코드는 삽입된 악성문서 등에서 실행된다.
      • 하지만 우리가 실행하는 코드는 해당 악성문서 등에서 쉘코드를 추출해서 에뮬레티어 또는 가상 환경에서 따로 실행하는 것이기에 조건이 충족되지 않아 실행 불가 할 수도 있다.
    • 이러한 이유 때문에 최근 추출한느 쉘코드들은 scdbg를 이용해 API 동적 분석이 어렵다.
    • 그렇기에 분석을 진행하려면 디버거에서 쉘코드가 동작하기 위한 컨디션 체크 루틴을 조작해 루틴을 우회하도록 설정할 필요가 있다.

     

    쉘코드 디버깅 방법은 3가지가 있다.

    1. 쉘코드를 실행파일(PE 파일)로 만들어 분석 진행
      • PE 파일이 기본 구조로 가지는 컴파일된 코드가 존재하는 섹션에 쉘코드를 위치시키고 해당 PE 파일의 Address Of Entry Point를 해당 섹션으로 지정
    2. 실제 쉘코드를 이용한 공격 환경과 동일한 환경에서 재현
      • 쉘코드가 실행될 수 있는 가상환경을 만들어주고 쉘코드를 실행시켜주는 별도의 서브 프로그램 사용
    3. 호스팅 프로세스에 쉘코드를 주입하여 디버깅
      • 코드 인젝션과 매우 유사

     

    호스팅 프로세스에 쉘코드를 주입하여 디버깅 하기 위해 쉘코드 환경에 맞는 32bit 디버거를 실행한다.

     

    x32dbg 실행

     

    메모장 로드

     

    정상 프로그램인 notepad.exe를 해당 디버거에 로드한다.

     

    메모리 할당

     

    쉘코드를 정상 프로그램인 notepad.exe에 삽입하기 위해 메모리 할당을 진행한다. 여기서 주의할 점은 할당하는 메모리의 크기가 삽입할 쉘코드의 크기보다 커야 한다.

     

    HxD 에디터 이용 쉘코드 크기 파악

     

    할당한 메모리 확인

     

    코드 인젝션

     

    HxD에서 확인한 쉘코드를 복사해 할당한 사용자 메모리 영역에 삽입한다.

     

    이후 삽입한 쉘코드의 첫 부분을 우클릭하고 디스어셈블러에서 따라가기를 클릭해 해당 위치로 이동한다.

     

    코드 삽입 부분으로 이동

     

    EIP 설정

     

    코드가 삽입된 부분으로 디스어셈블러에서 이동 후 해당 부분에 우클릭 EIP 설정을 통해 프로그램이 실행될 시 정상적인 notepad.exe 부분이 실행되는 것이 아닌 악의적인 쉘코드가 실행되도록 한다.

     

    • EIP 레지스터 : 32bit 아키텍쳐에서 사용하는 인스트럭터 포인터
      • 다음에 실행 할 명령어를 포인팅 함
      • 처음에 이 EIP 레지스터는 정상적인 실행 파일의 주소를 포인팅 하고 있지 쉘코드를 포인팅 하지 않음. 그렇기에 EIP 수정 필요

     

    IDA 이용 쉘코드 로드

     

    쉘코드 분석

     

    서브루틴으로 정의된 부분에서 지속적으로 ebp 함수를 부르고 해당 함수 호출전에 push 코드가 연속적으로 등장하는 것을 확인 가능하다.

     

    이런 경우는 대게 함수에 파라미터 전달을 하는 경우다.

     

    그렇기에 위의 경우 ebp 레지스터 안에 로드 라이브러리를 호출 및 push를 통해 로드할 라이브러리의 문자열을 파라미터로 해당 로드 라이브러리에 전달 하고 있는 것으로 추정 가능하다.

     

    이를 검증하기 위해 디버거에서 call ebp 부분에 Breakpoint를 설정 후 실행한다.

     

    디버거 Breakpoint 설정

     

    EIP 레지스터 및 Breakpoint 확인 후 F9를 눌러 실행 한다.

     

    첫번째 Breakpoint 도달한 후 확인 시 wininet.dll을 로드 하는 것을 확인 가능하다.

     

    wininet.dll 로드

     

    지속적으로 실행시켜가며 어떤 값들이 메모리에 로드 되는 지 확인한다. 이때 이전 API 해시 분석을 해 나온 결과 값을 토대로 참고한다.

    InternetOpen 함수 로드

     

    InternetConnect 함수 및 전달되는 파라미터 값

     

    전달되는 파라미터 값인 192.168.56.101에 대해 덤플에서 따라가기 기능을 통해 메모리 덤프에서 확인한다.

     

    덤플에서 따라가기

     

    HttpOpenRequest 및 /iWWE 파라미터

     

    HttpSendRequest 및 요청 송신 시 사용할 User agent

     

    응답 대기중

     

    HttpSendRequest를 이용해 C2 서버로 추정되는 192.168.56.101 IP에 요청 패킷을 보내지만 분석 PC는 인터넷과 연결되어 있지 않아 응답을 수신 하지 못해 대기에 빠진 모습이다.

     

    이렇듯 분석을 통해 정리할 수 있는 사실은 아래와 같다.

    • 분석한 쉘코드의 경우 192.168.56.101/iWWE에 HTTP 요청을 보내는 루틴을 가지는 쉘코드이다.
Designed by Tistory.