c로 컴파일된 악성 코드 3 - 고급 정적 분석

악성코드 및 포렌식|2021. 3. 13. 19:32

 

 

ida를 이용해 simple backdoor 를 분석

 

 

솔직하게 어셈블리언어보다는 api 함수들을 보는것이 낫다.

 

 

 

console의 윈도우를 얻어오고있다.

 

 

그뒤에 showwindow를 하고있는데 콘솔창에대한 윈도우상태를 바꾼다

지금은 보이지만 보이지않게 바꾸는것

 

그런 루틴으로진행한다.

 

xor esi, esi 

를 하면 0으로 초기화하는 것이다 si를 그것을

 

push esi로해서

 

cmdshow로하는데

보이지않게 쇼를 한다.

 

0으로 쓰기때문에 보이지도않는다고생각하면될거같고

 

 

createMutex 를 생성하고 쭉 진행을 하고있다.

 

즉 분기점이없다는 소리이다. 결과에상관없이 진행하겠다는 의미라 생각하면된다.

 

 

 

 

 

 

 

 

WSAStartup 을 하고있는데 소켓프로그래밍을 할때 가장먼저나오는 함수라고 생각하면됩니다.

물론 win socket 라이브러리를 사용할떄 

소켓을 초기화할때 이것이 나온다고생각하자

 

 

c에서는 사용하지않는데 컴파일러가 이것을 작성한다 !

 

 

애가나오면 아 소켓통신을 시작하려구나 라고생각하면된다.

 

 

 

 

 

htons 는 호스트이름을 네임서버로 바꾼다고생각하면됩니다.

 

 

 

그리고 bind가존재하는데

소켓의 포트번호를 넣어준다고 생각하면됩니다.

 

 

바인딩이 성공하지못하면 bind error가 나오게되고

 

 

 

0FFFFFH 는 -1인데 에러가 발생ㅎ

 

 

-1 이 아닌경우엔 에러 -1이아닌경우에 다른것을 따라간다.

 

 

 

 

 

그리고 mov eax, 539h 가 있는데 이것은 1337포트

 

즉 1337포트에 bind를이용해서 포트를 정하는것.

 

 

 

 

성공했을 가정하게넘어가면 listen 즉

 

지금 성공했으니 듣고있다는소리고

이게만약 잘못됬다면 error listening socket을 출력하게된다. 그리고 소켓을 초기화하고 종료를 하게됩니다.

 

 

 

 

 

 

이렇게 넘어가서 select 를 하는데 소켓프로그래밍이라고생각하면된다,

 

io에 대한 동기화를 위한 것인데 소켓을 결정하는 함수이다.

 

 

 

 

accept는 소켓에 대한 클라이언트 요청이 들어왔을떄 accept가 발생을 한다

 

즉 클라이언트와 연결이되었다~~ 

 

그리고 createThread 로 넘겨주게되고 1000초정도동안 수면을 하게된다.

 

 

 

 

그리고 lpStartAddress 가 존재하게되는데 이게 쓰레드가 동작하는 함수가 정의되있는곳

쓰레드함수의 위치가 여기에적혀있다

 

쓰레드 관련함수를 들어가보면

 

 

 

 

 

waitforsingleobject 가있는데

 

어떤 오브젝트에 대해서 기다리는 것 

 

그위에 잘보면 0FFFFFFFH dwmilliseconds가 

-1인데 무한대로 기다리겟다는 의미이다.

 

이것을 mutex backdoor 를 기다리는것

 

즉 이오브젝트가 뮤텍스백도어인데

그 뮤텍스백도어의 소유권을 가져오는 역할이다.

 

 

 

msdn 에서 자주 참고하는 것이 도움이 많이 될것이다 추측하지말고 찾아봅시다

 

 

 

뮤텍스를 사용하지않고 그냥 가져왓다가 풀어버린다...

 

 

 

 

 

그뒤에 createPipe를 두번을 해버리고

 

 

한번은 위에서 가져오고 edi를 밑에서 실행을하는것

 

 

 

 

pip를 만들고

 

 

startupinfo 에 대한 구조체를 만들어준다.

 

구조체를 만드는데 pip를 썻다고 생각하자.

 

 

프로세스에대한 입출력에대한 내용을 적게되잇다 구조체에는

 

 

 

 

 

create process를 하고 cmd를 할것이다 cmd의 입출력을 pipe로 하고있고

 

두개의 pipe중 하나는 write 하나는 read용

 

cmd에대한 pipe를 연결해주기위해서 startupinfo에다 정의를 해둔것이다.

 

strdup가 나오는데 이것은 문자열에대한 복사를 하는역할 입니다.

 

 

 

test eax,eax를 하는데 0이 반환 됫을 경우에 0이되서 빨간줄을 따라가게됩니다.

즉 프로세스 호출에 실패한것 0이된것

 

 

 

0이 아니면 

getexitcodeprocess로 가게되는데 

 

 

103h 와 still arrive 여전히 살아있는것 

 

103h와 strillarrive와 비교한다

쉽게애기하면 포르세스가 살아있는것

 

즉  죽어있다면 왼쪽  살아있다면 오른쪽으로 간다,

 

 

 

여전히 살아있는 경우에는

 

pipe 만들었던것의 데이터를 가져오기위해서 만들어놓은것이고 

 

데이터를 가지고있고

 

이상한값들을 비교하고있다

 

cmp [edi+104b0h

 

읽을 데이터가 없다면 오른쪽 초록생을 가게된다.

 

데이터가남는다면 데이터를 읽는다.

 

 

데이터를 쓰고있고

 

103h랑비교를 또 하고있고

 

 

또 데이터를 또받아들이고

 

send하고

 

recv하고

 

프로세스 다종료해주고 다시 올라가주고

 

무한반복으로 데이터를 받고 쓰고 만들고 전해주고 이러고있다고생각하면된다.

 

 

이런식으로 백도어의 원리정도를 알아봤다

 

데이터가없으면 recv로가고 마지막으로 가면 종료를 해버리게된다.

 

계속 무한반복으로 데이터를 처리해버립니다.

 

 

with 보안 프로젝트

댓글()