2018 Hacking Festival[악성코드]
※ 학교 내에서 1학년이 참가하는 대회로 기초지식 내 문제를 출제하였다.
※ 지식을 전달보다 시야를 넓히는데 목적이 있었다.
※ 이 문제가 왜 악성코드문제냐고 물어보면... 어느정도의 고민 후에 사용자가 의도하지 않는 동작을 하니까..?
1. 악성코드
1) 서론
▶ 흔히 악성코드문제는 리버싱 능력이나 실제 프로그램이 돌아가는 동작 중 나쁜?짓을 하는 부분을 찾는 문제 중 하나이다.
▶ 그러나 리버싱이 기초지만 그 기초를 하기 위해 더욱 기초가 되는 부분이 많고 1학년에서 이 부분까지 다루지 않았기 때문에 이런 식으로 동작하는 것도 있구나.. 정도로 시야를 넓혀주고 싶었다.
▶ 이 문제가 나오게 된 이유 중 하나는 다른 사람 컴퓨터에 장난을 치면서 시작되었다.
▶ 문제는 특별한 지식없이 누구나 풀 수 있을만한 문제이다.
2) 소스
[1] new folder.bat
@echo off
set count1=0
set number=1
:main
set pass=
set random_char=abcdefghijklmnopqrstuvwxyz0123456789!@#^()-+
set cnt=0
:start1
set /a num = (%random% %% 44)
call set char=%%random_char:~%num%,1%%
set pass=%pass%%char%
set /a cnt=%cnt%+1
if %cnt% lss 20 goto :start1
md %number%%pass%
cd %number%%pass%
set /a number=%number%+1
rem timeout 1
set count2=0
:first
set pass=
set cnt=0
:start2
set /a num = (%random% %% 44)
call set char=%%random_char:~%num%,1%%
set pass=%pass%%char%
set /a cnt=%cnt%+1
if %cnt% lss 20 goto :start2
md %number%%pass%
cd %number%%pass%
set /a number=%number%+1
set count3=0
:second
set pass=
set cnt=0
:start3
set /a num = (%random% %% 44)
call set char=%%random_char:~%num%,1%%
set pass=%pass%%char%
set /a cnt=%cnt%+1
if %cnt% lss 20 goto :start3
md %number%%pass%
cd %number%%pass%
set /a number=%number%+1
set count4=0
:third
set pass=
set cnt=0
:start4
set /a num = (%random% %% 44)
call set char=%%random_char:~%num%,1%%
set pass=%pass%%char%
set /a cnt=%cnt%+1
if %cnt% lss 20 goto :start4
if %number%==110 (
md S
)
if %number%==147 (
md H
)
if %number%==230 (
md E
)
if %number%==280 (
md R
)
if %number%==320 (
md A
)
if %number%==350 (
md T
)
if %number%==528 (
md T
)
if %number%==620 (
md E
)
if %number%==679 (
md W
)
if %number%==747 (
md E
)
md %number%%pass%
cd %number%%pass%
set /a number=%number%+1
cd ..
set /a count4=%count4%+1
if %count4% lss 5 goto :third
cd ..
set /a count3=%count3%+1
if %count3% lss 5 goto :second
cd ..
set /a count2=%count2%+1
if %count2% lss 5 goto :first
cd..
set /a count1=%count1%+1
rem echo %count1%
if %count1% lss 5 goto :main
▶ 위 소스는 처음에 작성하면서 따로 게시하려고 한 것이 아니기 때문에 변수명이나 이런부분에 대해서 세밀한 부분을 신경쓰지 못했기에 이 부분을 고려하면서 보기를 바란다.
▶ 윈도우 배치파일 형태로 작성되었다.
▶ 위 소스는 랜덤한 글자(영소문자, 특수문자일부, 숫자) 20자를 저장하고 이 글자로 새로운 폴더를 생성하는 것이다.
▶ 실행시켜보면 5개의 폴더가 있고 하나를 들어가보면 또 5개의 폴더가 있고 아무거나 하나를 들어가보면 또 5개의 폴더가 있는... 폴더마다 자식폴더를 5개씩 낳고 있다.. 그것도 작명도 이상하게 만들어서... 사용자가 원하지 않는데...
▶ 폴더 앞에는 폴더 개수를 의미하는 숫자를 붙여주었다.
▶ 110, 147, 230, 280, 320, 350, 528, 620, 679, 747 번호가 붙은 폴더가 있는 곳에는 추가적으로 단어가 하나 적혀있는 폴더가 생성된다.
▶ for문[Ex)for /L %%i in (1,1,5) do ()]을 사용하지 않고 구지 goto문을 사용한 이유는 for문의 경우 매번 변하는 시간을 사용하기 위해 time명령어를 사용했으나 for문이 한 번 들어갈 때 저장한 그대로 변하지 않았고 변하지 않는 시간은 의미가 없기 때문에 goto문을 사용하였다. 그러나 현재는 시간대신 번호로 카운터하고 있다.
3) 실행파일로 변환
▶ 만약 배치파일 형태로 제공될 경우 소스를 확인할 수 있고 실행 시 콘솔창이 뜨면서 기분나쁜?폴더명을 가진 폴더가 생길 경우 콘솔창을 끌 가능성이 있기 때문에 실행파일 형태로 배포하려고 한다.
▶ bat_to_exe_converter를 사용하여 변환하였다.
▶ 위 그림와 같이 확장자명을 평소에 표시하지 않는 일반사용자의 경우 실행파일 명이 "새 폴더" 라고 나올 것이다.
▶ 그런데 생긴거부터 왠지 기분나쁘게? 생겼고 열면 안될 것 같은 느낌이 먼저 든다..
▶ 실제로 "새 폴더"를 더블클릭할 경우 많은 양의 폴더가 폴더 안에 자식을 낳고 그 자식폴더도 자식을 낳게 된다.
▶ 이 과정은 백그라운드에서 돌아가며 실행 시 사용자가 볼 때에 아무런 동작이 하지 않는 것처럼 느껴진다.
▶ 알려진 확장자명을 숨기지 않도록 하는 사람의 경우는 "새 폴더.exe"로 나올 것이다.
4) 풀이방법
[1] 문제를 푸는 방법은 폴더 내에 특별한 폴더를 찾고 그것을 조합하면 되는 매우 간단한 문제이다.
[2] 특별한 폴더 확인
▶ 탐색기를 트리구조로 보면서 계속 열어보아도 되고 속성을 확인해서 폴더별로 차이점이 있는지 확인해보아도 좋다.
▶ 실제로 폴더의 개수가 뭔가 하나 더 있는 폴더가 있는 것 같고.. 이런식으로 찾아들어가니..
[3] 다른자식의 폴더?
▶ 위 그림과 같이 다른자식이 낳은 느낌의 폴더가 하나 쏙 있다.
▶ 이쯤 눈치챘으면 상위디렉터리에서 a~z까지 검색을 하거나 눈치를 못 챘다면 폴더란 폴더는 다 찾아볼 것이다.
[4] 애너그램
▶ 어떤 방식으로든 10개 알파벳을 다 찾았으면 그것을 조합해서 단어 하나를 만들면 된다.
▶ 애너그램(단어를 가지고 나올 수 있는 단어는 모두 조합해서 보여준다.)을 이용해서 해결하기를 바랬다.
▶ SWEETHEART이라는 단어가 정답이 된다.
▶ 원래는 애너그램이 아닌 파일 생성시간을 기준으로 조합하는 방식으로 출제하려고 했었으나 포렌식분야의 문제 쪽으로 가는 느낌이 들어서 수정하게 되었다.
[5] 출제방향
▶ 원래 문제의 모티브가 된 배경이 있다.
▶ 참고 :
[7] 느낀점
▶ 악성코드는 자기자신을 계속 재호출하거나 돌연변이를 찍어내거나 하는 등의 악성코드가 무서운 것 같다.
▶ 문제가 낯썬지 실행파일을 클릭만 해보고 처음에 시도하다가 모르겠어서 다른문제를 푸는 사람이 많았다.
▶ 한 명도 푼 사람이 없어서 폴더별 속성을 확인하라는 힌트를 주니 대부분의 참가자가 맞추었다.
'Review' 카테고리의 다른 글
2018 Hacking Festival[게임문제] (0) | 2018.12.24 |
---|
댓글