본문 바로가기

Write Up

정보보호올림피아드2015 본선 Q5


이번에도 리버싱 문제입니다. 실행을 해 보면 

ID를 입력받습니다. 제 아이디인 5unKn0wn을 입력하면 잠깐 멈칫 했다가 종료됩니다. 그 사이에 아주 잠깐 con2.exe라는 파일이 생성된 뒤 다시 삭제됩니다. 바로 올리디버거로 열어서 동적분석 해 보겠습니다. 메인 함수부터 분석해 보면 

문자열들과 파일이 다 보입니다. con2.exe도 있네요. ID를 입력받고 난 뒤를 보면 

입력한 ID를 인자로 전달하고 어떤 함수를 호출합니다. 이 함수 내에서는 제가 입력한 ID를 가지고 

연산을 거친 뒤 이 문자열을 만들어 냅니다. 이 함수를 나오고 난 뒤에 이번에는 con1.exe, con2.exe등의 인자를 넣어주고 새로운 함수를 호출합니다.

함수 내에서는 자기 자신을 열어서 con2.exe실행파일을 만들어 냅니다. 

fopen으로 파일을 엽니다. 자기 자신에서 

새로운 실행파일을 읽어 들입니다. 이렇게 해서 con2.exe를 생성합니다. (사실 헥스에디터로 열어서 보면 con1.exe파일 끝에 새로운 실행파일이 하나가 더 붙어있습니다.) 그리고 생성된 exe파일에 아까 입력한 ID로 만든 문자열을 인자로 넘겨주어 CreateProcess함수로 프로세스를 다시 만듭니다. 

스택의 상태를 보면

이렇게 인자가 들어가 있습니다. 이렇게 프로세스를 만들고 con1.exe의 역할은 끝났습니다. 이제 우리는 con2.exe를 분석하면 됩니다. 

con2.exe는 실행해도 아무것도 뜨지 않습니다. 

그리고 UPX가 걸려 있으므로 풀어주고 분석해 보겠습니다. 

먼저 메인을 분석해 보면 우선 인자가 2개이어야 합니다. 하지만 올리디버거에서는 인자를 넣어서 실행할 수가 없습니다.(혹시 있다면 방법을 알려주세요!)(밑에 댓글에서 방법을 찾았습니다.) 그래서 임의적으로 인자로 들어가는 argc와 argv를 직접 패치해서 인자를 넣어줍니다. 

argc를 수정하고 

argv를 넣어줍니다.

그리고 키를 생성하는 함수를 호출합니다. 

함수 내부에서 이렇게 키를 만드는 루틴을 지나고 나면 

키가 생성이 됩니다.


KEY : bd6B66f6bd