고급 정적 분석 - ida

악성코드 및 포렌식|2021. 3. 7. 15:50

 

lab 05 .dll을 분석하자.

 

 

 

1. dll main의 주소는 무엇인가?

-DLL 의 메인함수 DLL 이 로드 될떄

-4가지 정도의 정의를 할수 있다.

 

DLL로드, 언로드 , DLL 어태치

 

 

이곳이 바로 Dllmain의 부분이고

 

이 선택된 창에서 space바를 누를시

 

 

 

 

이렇게주소가 나온다.

 

name에서도 찾을 수가 있었다.

1000D02E에 있다.

 

 

 

 

 

2. imports 윈도우를 이용해 gethostbyname 을 탐색 해보자. 임포트 위치는 어디인가?

 

 

 

0x100163CC 에 위치해있다.

 

 

 

 

3. gethostbyname을 호출하는 call 명령어는 몇개 인가?

 

 

jump to cross reference를 합니다.

어디서 gethostbyname 을 참조하는지 9개가 나오게됩니다.

 

 

 

 

 

 

 

 

 

 

4. 0x10001757에 위치한 gethostbyname 호출을 보면 어떤 dns 요청이 이뤄지는지 알 수 있는가?

 

gethostbyname 매크로 (wsipv6ok.h)

  • 2018 년 5 월 12 일
  • 읽는 데 4 분

경우 gethostbyname 호스트 데이터베이스에서 호스트 이름에 해당하는 기능을 검색하여 호스트 정보를 제공합니다.

 

docs.microsoft.com/en-us/windows/win32/api/wsipv6ok/nf-wsipv6ok-gethostbyname

 

gethostbyname macro (wsipv6ok.h) - Win32 apps

The gethostbyname function retrieves host information corresponding to a host name from a host database.

docs.microsoft.com

 

 

 

 

 

 

 

 

 

g를 눌러 010001757 을 눌러 주소로 이동한다

 

eax는 어디로 부터 왔는가.

 

 

eax <- 10019040 곳의 데이터를 가져온다. (0X10019194

 

eax 에 0D를 더함 (0x10019194 +0D = 100191A1)

 

G로 따라간다.

 

 

그랬더니 이렇게 우리가원하는데이터가 

 

여기있는것이다 .

 

Pics.practicalmalwareanyalysis.com

 

 

[] 안에 있는것은 D바이트 만큼 옮겨졌기때문에 실질적으로 아무런 영향을끼치지않는다.

 

 

 

 

 

 

 

 

 

5. 0x1001656에 있는 서브루틴에서 IDA Pro 는 지역 변수 몇개를 인지하고 있는가?

6. 0x1001656에 있는 서브루틴에서 IDA Pro 는 파라미터 몇개를 인지하고 있는가?

여기서 -붙은것은 지역변수라는 의미이다.

 

 

결국 답은 20개의 지역변수와, 1개의 파라미터를 가지고있다.!

 

 

7. Strings 윈도우릉 이용해 디스어블리 내의 문자열 \cmd.exe /c 를 찾아보자. 어디에있는가?

0x100101D0 에있다.

 

 

 

 

100101D0

 

 

 

 

8.\cmd.exe /c 를 참조하는 코드영역에서 무슨일이 발생하는가?

 

 

 

 

 

notepad.exe 는 실행이되면서 바로 넘어온다

 

근데 

 

cmd.exe /c notepad.exe는 실행이될때까지 프롬프트가 멈춘다.

 

동기화적인 기능을위해서 프로그램이 끝날떄까지 기다리는 그런 루틴이라고 생각합니다.

여기서 잘보면 시스템디렉토리를 얻고

 

 

왼쪽걸 호출할지 오른쪽 호출을 할지 정합니다.

 

버전에 따라서 command를 실행할지 cmd를 실행할지 루틴을 정하는 것 입니다.

 

 

전체적인 루트는 환경을 탐색한뒤에 

 

백도어로써의 역할을하기위해 들어온 명령어를 따라서 루틴을 가르기 시작한다.

 

 

사람마다 다르게적을 수있겠지만 이코드 영역에서는 백도어를 만든 공격자의 실행 명령어를 실해하기위한

 

세팅 작업이 일어납니다.

 

 

 

 

9. 같은영역 0x100101c8 에서 dword_1008E5C4 는 경로를 지정하는는 전역 변수로 보인다. 악성코드는 어떻게

dword_1008E5C4를 설정하는가? (힌트: dword_1008E5C4의 상호 참조를 이용하라)

 

 

 

경로를 지정하는 전역변수로 보이니까 메모리가 할당되어있지않고 나중에 실행하면 할당받을 것이라고 보여진다.

 

 

상호 참조기능을 이용하려 진행해 보자

 

 

 

 

 

데이터를 받아오는 것을 알수있다.

 

 

 

 

 

GETversion이라는 함수를 통해서 커널 버전을 참고를 하고 저장한다

 

 

10. 0x1000FF58에서 서브루틴으로 수백 라인은 문자열을 비교하기 위한 일련의 memcmp 비교다. robotwork와 문자자열 비교가 성공적으로 이뤄지면 무슨일이 일어나는가?

 

 

맞으면 왼쪽으로가고 아니면 오른쪽으로 간다.

 

아니니까 왼쪽으로 따라가보고

 

여기에 이름을 바꿔준다.

 

바꿔주는 이유가 robotwork라는 명령어를 썻을떄 실행되는 친구라고 생각하면된다.

 

이친구를 들어가본다.

 

 

레지스트리를 오픈 하고있고

 

software \\microsoft \\ windows\\ currentversion을 오픈하고있습니다.

 

 

 

그밑에는 WorkTime 관련된

RegQuertyValueExA 하고있습니다.

 

작업시간을 atoi 즉 아스키 값을 받아서 인트형으로 바꾸는것 같고

 

 

 

 

그리고 내려가보면

로봇이 작동한 시간에대한 문구가 나옵니다

  그리고

 

sprintf를 합니다 이것은 문자열을 붙이는 역할을 합니다.

 

 

밑에내려보면 길이를재는 함수도있습니다.

위에 sub_100038EE 가 있어서 이부분에 대한 내용을 보니까

 

 

 

send가있고 이것은 

네트워크를 통신을할때 소켓통신을 하는 놈입니다.

 

그래서 유추를 해볼수있었습니다.

 

이런식으로 그래프 화를 시키며 손쉽게 볼 수 있었습니다.

 

 

결국 결론은

robotwork는 작업 시간을 출력하는 것으로 보입니다 . 나중에 문자열도 만들고  레지스트리를 조회하고 network를 통해 데이터를 전송한다,

 

 

라고 이름을 바꿔서 나중에 알아보기슆게 만듭니다.

 

 

 

 

11. pslist 익스포트는 무슨 역할을 하는가?

 

 

dll의 경우에는 exports 함수에 대한내용이 원래많다.

들어가보고

 

 

그래프화로 시켰을떄 이렇게 볼수가있었다.

 

Process32First EnumProcessModules GetModuleFileName OpenProcess

 

애네가 프로세스 리스트를 얻는 함수이다.

 

이함수를 호출하는애가 pslist인것이다.

 

재네둘이 물론 갈라지는 것은 맞지만 여기에서 같은 함수를 참조하는 것이라는 건 

다른 점이 없다는 것이다.

 

 

어떤 데이터를 확인해보는것 오른쪽은 데이터를 볼때 소켓을 통해서 통신을할때 사용한다.

 

 

 

 

왼쪽을 들어가보게되면

 

th32processid 를 통해서 creathTollhelp32Snapshot을 생성을합니다.

 

 

 

process32Firest 

도 사용을한다.

 

 

다음프로세스 다음프로세스 계속 검색을하고 마지막에 null이나올때까지 돌리면

모든프로세스를 검사했었다는 것도 알수가있다.

 

 

 

process32next를 하고 일때 다시올라가서 null인지 아닌지확인하고

 

 

 

 

만약 null 이면 오른쪽으로  closehandle을 하고

아니면 왼쪽으로 계속해서 프로세스 검사를 해서 받는 것입니다.

 

 

결론은 프로세스 리스트를 분석하는 함수라는 것을 알수있다.

 

 

 

12 그래프모드를 이용해 sub_10004E79 상호 참조 그래프를 그려보자. 이함수에 진입하기 위해 호출하는 API 함수는 무엇인가? 해당 API 함수에만 기반을 두고 이 함수를 어떤이름으로 변경하겠는가?

languageid 를 체크하는 함수인 것도 알수있다

 

getsystemdefaultlangid 를 얻어서 데이터를 보내는 애라는 것을 알수있다 

 

 

 

start address 를 통해서 create Thread를 하는 것을 알수있다.

 

 

호출하는 api함수는 CreateThread 이다.

 

CreaTthread를 통해서 백도어 함수를 진행한다.

 

 

 

 

13.DLL MAIN 이 직접 호출하는 윈도우 API 함수는 몇개 인가? 두번째 깊이 (depth of 2) 에서 몇개 인가?

너무많다....

 

 

 

dll 메인을 호출하는것이아니라 dll메인 에서 호출하는 두개깊이까지만 구합니다.

한20~30개 일것으로 추정,,,세기가 힘들다.

 

 

 

 

 

14 0x10001358에서 sleep 호출이 존재한다. (sleep까지 수 밀리초 값을 파라미터로 갖는 API함수) 코드 후반부를 보면 이 코드가 수행되려면 프로그램이 얼마 동안 sleep하는가?

 

 

 

 

eax 에 얼마나 넘어왔냐에 따라서 슬립이 얼마나 되는지 알수있다.

 

10019020 으로부터 데이터를 가지고와( 0x100192AC)+     0D 데이터 를 더한다.

여기에 아스키값을("30")을  인트(30)형으로 바꾸고

 

imul( 멀티플라이) 곱하기임!!!

 

그래서 3E8( 십진수로 1000) 을 곱해서 eax에 전달이됩니다.

 

30*1000 밀리세컨드=30초

 

 

그래서 계산을해보면  0x100192AC

 

거기로 가본다

 

 

30이 나온다.

 

 

 

 

 

 

 

15 . 0X10001701에서 소켓을 호출한다. 세가지 파라미터는 무엇인가?

 

 

 

docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket

 

socket function (winsock2.h) - Win32 apps

The socket function creates a socket that is bound to a specific transport service provider.

docs.microsoft.com

 

 

 

 

 

여기에서 소켓과 관련된 것을 찾고 저기 ida에서 확인했을떄 일치하는 숫자의 

심볼릭을 이렇게 바꿔줍니다.

 

 

 

 

 

 

 

 

 

댓글()