OutDoorFrog의 리버싱 이야기

HackingCamp2018 CTF WriteUp(TheEnd) 본문

공부/CTF 문제 풀이

HackingCamp2018 CTF WriteUp(TheEnd)

OutDoorFrog 2018. 9. 11. 23:16

안녕하세요! 블로그의 주인장 OutDoorFrog입니다!





리눅스 디버깅 환경 준비하느라 혼났습니다.


리눅스에서 동작하는 악성코드를 분석하기 전에

머리 좀 풀어볼까하고 문제를 풀었습니다.



각설하고 시작하겠습니다!!



1. Detect It Easy로 정보 수집





라이브러리는 GLIBC를 쓰고


컴파일러는..(뭐지)


그래도 환경에 맞춰서 우분투에서 디버깅하는 것이 좋겠습니다.



2. IDA & Edb Debugger


이번에 저를 도와줄 새 친구는 바로!



evan's Debugger 입니다.


리눅스계의 올리디버거입니다.(역시 GUI가 편-안)


친구의 도움을 받아서 gdb를 써봤는데 적응이 안되더군요.



3. 구조를 파악하자.


이 문제는 특이하게 볼 부분이 두개가 있습니다.



붉은 원으로 표시한 두 부분이 있는데요.


높이가 긴 직사각형 : 플래그 하드코딩된 부분


너비가 긴 직사각형 : 입력한 플래그를 검증하는 부분


아무래도 코드를 보시는게 편안하실듯 합니다.


4. 상세히 들여다볼까?


  4.1 플래그 하드코딩 부분



유추할 수 있는 특징이 두가지가 있습니다.


1. 하나에 배열에 포인터를 여러 개를 나누었다.


2. 배열을 0으로 초기화하고 모든 배열에 값을 대입하지 않았다.


안타깝게도 첫 번째 특징은 사실이 아닌 것 같더군요.


트레이싱을 해봤을 때도, 스탭님께 여쭤봐도 아니라는 결론이 나왔습니다.


따라서 복원할 수 있는 코드는...


char flag[29] = { 중간중간 초기화가 빠진 데이터 };


char * INPUT;


printf("INPUT : ");

scanf("%100s", &INPUT);


이런 식으로 코드를 복원할 수 있을듯 싶습니다.


   4.2 정답 판단 루틴



For, While 문에 나타나는 전형적인 특징이라고 볼 수 있습니다.



string[i] ^ Input[i] == input[i+1]


이런 알고리즘을 유추가 가능하겠네요.



input의 값이 틀린다면 IsFlagTrue를 0으로 설정해주고

맞다면 i++을해서 넘겨주는 식을 알 수 있겠습니다!


따라서 유추할 수 있는 코드는!


DWORD IsFlagTrue = 1;


for(DWORD i=0; i<=29; i++)

{


if(input[i] ^ flag[i] == input[i+1]) {



else {


IsFlagTrue = 0;


}


}



   4.3 정답 판단 후 출력 루틴




간단한 루틴이로군요(가즈아아!)


if(IsFlagTrue)

{

printf("The Flag is HCAMP{%s}",INPUT);

}

else

{

_puts("NOPE");

}




   4.4 코드를 모아보자.



char flag[29] = { 중간중간 초기화가 빠진 데이터 };

char * INPUT;


printf("INPUT : ");

scanf("%100s", &INPUT);


DWORD IsFlagTrue = 1;


for(DWORD i=0; i<=29; i++)

{

if(input[i] ^ flag[i] == input[i+1]) {

else { IsFlagTrue = 0;}

}


if(IsFlagTrue) printf("The Flag is HCAMP{%s}",INPUT);}

else {_puts("NOPE");}


   4.5 알고리즘 파악


빨간 원 안, 같은 열에 있는 숫자를 XOR 합니다.

XOR 한 값과 Input의 다음의 숫자와 비교합니다.


XORInput 다음의 숫자가 같아야 됩니다. (이게 정답)


역산한다면 적어도 첫 번째 Input의 값이 반드시 결정되어 있어야 합니다.




   4.6 Flag BruteForce


(공격의 이해) BruteForce, 무작위 대입 공격(답을 마구 넣는 행위)


(역할의 이해) 아스키코드는 0~255까지 할당된 역할들이 있죠.


(공격 범위 추측) 해킹 캠프 ctf 플래그 관례상 첫 번째 문자부터 특수문자가 들어갈 일은 거의 없을 겁니다.


(공격 범위 확정) 십중팔구, (A~Z), (a~z), (0~9)중에 하나입니다.



롸업.cpp


이렇게 플래그가 뜹니다. (이왕할꺼 파일공유)


리눅스에서 리버싱하는 환경은 익숙치 않아서


문제 루틴도 쉬울 겸 온전한 의미의 '리버싱'을 해보기로 했습니다.


문제를 푸는 동안 리눅스 환경에 익숙해질 수 있었던 것 같습니다!



해캠에서의 풀 수 있는 리버싱 문제는 다 푼 듯 싶습니다!




이런 문제를 준비해주신 스탭님들께 감쟈를 드립니다! 

Comments