OutDoorFrog의 리버싱 이야기

Ajou OpenCTF 2018 WriteUp [gui montag] 본문

공부/CTF 문제 풀이

Ajou OpenCTF 2018 WriteUp [gui montag]

OutDoorFrog 2018. 9. 28. 11:08

이 이야기는 어느 리버서의 고통받는 이야기입니다.

 





Windows API 만져본지 8개월이 다 되가는데 분석 문제가 나왔습니다.



문제가 이렇게 나올 줄은 몰랐으며 리버싱하는데 꽤나 걸렸던 문제입니다.



한 글자 한 글자를 연산하는 문제!!!

같이 보시죠!!



1. DIE로 분석




Default로 설정이 되어 있군요..



2. IDA로 분석해볼까?






붉은색을 Brush Paint로 칠했군요.


Hand-Ray 프레임워크를 사용합시다.


hand-ray에 대한 이미지 검색결과


핸드-레이 프레임워크는 c->asm, asm->c 가 가능한 프레임워크 입니다.


용량도 가벼워서 사람들이 정말 많이 사용하는데요.


그렇습니다.


우리의 뇌와 손이 있으면 됩니다.


말 그대로 인간 디컴파일러!!



3. 힌트 코인



IDA 덕분에 Winmain으로 Main 함수가 만들어져있는 것을 알았습니다.


좀 더 많은 힌트가 필요합니다.


문자열을 수집합시다.




Flag, Wrong, Try Again



(일단 뇌피셜 프레임워크를 돌려줍니다)



음.. 놀리는 것도 아니고 틀렸다는 것을 두 번 알려줄 리는 없습니다.



MessageBoxA 함수를 사용했다고 유추할 수 있겠군요..



반면 Flag 문자열은 하나만 있으니 WinMain에 그대로 출력해줄지도..?



4. 실행해서 확인



백견이불여일문 입니다. (그 반대인가??)


실행시켜서 시나리오를 검증해봅시다.



16글자를 입력한 후




17글자를 입력하려 하자 초기화 됬습니다.




16개의 글자를 입력 받는지도 모르겠군요




입력 부분은 알았는데 루프를 어떻게 빠져나와야 할까요?


아무 문자나 입력하다가 종료시켜봤습니다.




호오... 종료 이벤트가 일어나면 루프를 벗어나는군요?




5. 루틴 파악, 야매 코드 작성




프로그램의 전체적인 흐름을 파악하면



화면 구성 -> 입력 -> 종료 이벤트 -> 판단 -> 출력



요런 식으로 구성이 됩니다.



int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nShowCmd)

{


// 화면을 설정하는 구문


~~~


// 입력받는 구문


// 입력받을 수 있는 글자는 16 (NULL까지 하면 사실상 15글자)


While(GetMessageW(&Message,NULL,0,0)) // 종료 이벤트 발생시 루프 탈출

{

TranslateMessage(&Message);

DispatchMessage(&Message);

}



// 값을 수정하는 구문


// 수정된 값을 이미 수정되어 있는 플래그와 비교하는 구문


조건이 맞으면

{


// MessageBoxA(NULL,"Flag","플래그 내용",NULL);


}

조건이 틀리면

{


// MessageBoxA(NULL,"Try Again", "Wrong",NULL);


}


}



  • 화면 구성 루틴 -> 복구 필요 X

  • 입력 루틴 -> 복구 완료

  • 판단 루틴 -> 복구 필요 O

  • 출력 루틴 -> 복구 완료






판단 루틴만 복구해내면 되겠군요.



6. 복구 해낸 코드



어셈블리어 상으로 보면 연산 순서가 꼬여 있습니다.


문자 하나 하나를 특정한 주소에 저장하고


저장한 문자와 특정값과 XOR 합니다.


XOR한 값과 특정한 값이 같으면 숫자의 카운트가 올라가는데


카운트가 0x10이면 플래그로 판단합니다.




판단 루틴.txt




판단 루틴만 복원한 슈도 코드입니다.(잘 쓰시길 ^^)




문자열을 역산하면 정답은


Showmeanewworld





7. 정답 확인



플래그가 맞나 확인해봅시다.




플래그가 맞군요.





8. 푼 소감



제가 Windows API에 대해서 조금 공부를 해본 사람입니다.



(Windows API, 윈시프, MFC, ATL, WDK ...)



하지만 개발한 프로그램을 따로 리버싱을 해보지는 않았습니다.





처음 분석할 때는 어떤 루틴인지는 머리에서 추측은 되는데 

안개가 낀 느낌이랄까...?



고생이 많았지만 추석 때 연습을 해보니



삽질에 대한 이미지 검색결과



풀어보고 보니 기분이 좋긴합니다. ㅎㅎ

Comments