hash : 6dfce07abc39e5d6aebd74a1850ad65cc6ce10a8540b551c4f6d441ec4cf48ab (sha256) kimsuky 악성코드는 많이 알려져 있다시피 APT (A ; advanced, P : persistent, T : threat) 공격을 하게 되는데, 이 APT 공격은 쉽게 말하면 자신이 목표로한 타겟만 계속해서 지속적으로 공격하는 것이다. 그래서 나는 이 샘플 파일을 얻기 위해 kimsuky 키워드로 트위터에 검색을 해서 hash를 알아낸 뒤 hybrid-analysis 사이트에서 샘플을 다운 받았다. 이 악성코드가 하는 일은 간단하다. 2개의 파일을 생성 & 실행 하는 것이다. 생성은 Resource데이터를 이용하여 CreateFileA 함수를, 실행은 S..
왠만하면 악성코드들은 32 bit 프로그램이다. 왜냐하면 32 bit 프로그램은 32 bit, 64 bit 환경 아래에서 둘 다 동작하기 때문이다. 그런데 악성코드들 중 64 bit로만 작성되어야하는 코드들도 있다. 1. 커널 코드 커널이 64bit에서 동작한다면, 커널 코드가 64 bit이므로 루트킷과 같이 커널과 상호작용하는 악성코든는 64 bit일 수 밖에 없는 것이다. 2. 플러그인 & 코드 삽입 64 bit 어플리케이션이 동작 중인데 그 어플리케이션에 코드를 삽입하거나 악성 플러그인을 로드하려면 악성코드들도 64 bit여야 할 수 밖에 없다. 3. 쉘코드 2번과 마찬가지로 64 bit 프로그램에서 쉘코드가 정상적으로 작동하기 위해서는 64 bit를 위한 쉘코드를 작성할 필요가 있다.
1. 윈도우 API 사용 IsDebuggerPresent() PEB에서 IsDebugged 검사 CheckRemoteDebuggerPresent() PEB에서 IsDebugged 검사 & 자기 자신 or 로컬 컴퓨터의 다른 프로세스만 검사 가능 NtQueryInformationProcess() OutputDebugString() SetLastError()로 에러 설정 OutputDebugString()함수를 이용해 디버깅 중이면 이 함수는 성공, 디버깅 중이 아니라면 에러 코드를 설정하므로, 디버깅 여부 판단 가능 2. ProcessHeap 플래그 검사 힙 헤더의 플래그를 살핌으로서 디버깅 여부 판단 3. NTGlobalFlag 검사 PEB의 0x68부분이 0x70인지 확인 4. 레지스트리 & FindW..
디스 어셈블리 기법에는 2가지가 있다. 1. 선형 디스어셈블리 예외 없이 코드 블록을 반복하면서 디스어셈블한다. 그래서 switch 포인터를 담고 있는 배열 등 등 데이터도 명령어로 해석해버린다. 2. 흐름 중심 디스어셈블리 jmp, call과 같은 논리적 흐름에 따라 디스어셈블한다. jz 이런 조건 분기의 경우 거짓 또는 참을 가정하여 디스어셈블한다. 이런 요소를 이용해 안티 디스어셈블리 기법을 개발할 수 있다. 안티 디스어셈블리 1. jz, jnz를 이용하여 동일한 위치로 점프하는 명령어를 구상 & 0xe9(jmp) or 0xe8(call) 들을 적적히 배치한다. 조건 분기에서 거짓을 가정하고 디스어셈블하게 되면 call 또는 jmp를 먼저 디스어셈블하게 된다. 2. 2개 이상의 명령어가 한 메모리 ..