본문 바로가기
기타/DMZ

CyCommMech 분석

by ITPro 2012. 9. 12.

※ 명령 형식이나 사용법 등이 cyc.help 파일에 자세히 정의되어 있어 특이한 사항만 작성해 보았습니다.


CyCommMech는 오픈소스 IRCBot인 EnergyMech을 변형하여 제작된 것으로 추측되며 UDP Flooding 툴인 Stealth와 함께 배포되었습니다.


기본적인 실행 옵션은 아래와 같습니다.


 옵션

설명 

 -f <file>   read configuration from <file>

 -c

  make core file instead of coredebug/reset
 -r <num>

  run only for <num> seconds

 -d   start mech in debug mode
 -s <name>   process spoof
 -o <file>   write debug output to <file>
 -h   show this help
 -v   show EnergyMech version



-s 옵션은 다른 옵션과는 다르게 스위치 구문으로 처리되지 않고 이전 단계에서 처리되고 있습니다.

봇이 실행되고 나면 우선 실행시 인자값이 추가로 전달되었는지 확인하고 인자값이 전달되었다면 문자 's'가 첫번째 인자(argv[1])에 존재하는지 확인하고 두번째 인자의 문자열의 값으로 프로세스 명을 변경합니다.

(두번째 인자가 존재하는지 검증하는 루틴이 없기때문에 실행시 두번째 인자를 전달해주지 않으면 Segmentation Fault 에러가 발생합니다.)


프로세스 명의 위조는 argv[0]에 argv[2] 값을 strncpy 함수를 이용하여 덮어쓰는 방식을 사용하고 있으며 해당 내용을 직접 작성해서 테스트해본 결과 정상 작동하는 것을 확인하였습니다.


-s 옵션과 관련된 처리가 끝나면 전역 변수들의 초기화 작업을 거친 뒤 -s 옵션을 제외한 나머지 옵션에 대한 처리가 이루어지고 doit 함수를 호출합니다.

doit 함수가 실행되면 먼저 readcfgfile 함수를 호출하여 설정파일을 읽어들이는데 기본적으로 cyc.set 파일을 이용하지만 cyc.session 파일이 존재한다면 cyc.set 파일을 읽어들이지 않고 cyc.session 파일을 읽어들입니다.


모든 설정이 마무리되면 cyc.set 또는 cyc.session 에 정의된 IRC 서버에 연결하고 명령을 기다리다가 메세지를 처리하는 process_incoming_chat과 onmsg 함수를 호출하여 명령을 처리합니다.



on_msg에서는 실질적인 명령 코드에 대한 처리가 이루어지는데 해당 메세지가 LEVEL 100이 넘는 사용자로부터 전달되었으면 바로 종료가 됩니다.

(cyc.help 파일에 정의된 LEVEL 상에서는 일반 Bot이 200의 LEVEL을 갖습니다.)





on_msg의 코드를 따라가다보면 전역변수인 mcmd의 값이 비어있는지 확인하는 코드가 나오는데 mcmd는 각 명령의 별칭과 해당 함수의 주소를 포함한 4개의 데이터를 가지고 있습니다.


 



그 이후 전달된 메세지와 mcmd의 값을 비교해서 같은 값이 나올때까지 반복한 뒤 같은 값을 찾으면 mcmd에 저장되어 있는 함수 시작주소를 CALL 명령을 통해 호출합니다.





지금까지 정리된 내용은 여기까지이며 특이사항이 좀 더 발견이 되면 추가하겠습니다.

반응형