OutDoorFrog의 리버싱 이야기
HackingCamp2018 CTF WriteUp(TheEnd) 본문
안녕하세요! 블로그의 주인장 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의 다음의 숫자와 비교합니다.
XOR와 Input 다음의 숫자가 같아야 됩니다. (이게 정답)
역산한다면 적어도 첫 번째 Input의 값이 반드시 결정되어 있어야 합니다.
4.6 Flag BruteForce
(공격의 이해) BruteForce, 무작위 대입 공격(답을 마구 넣는 행위)
(역할의 이해) 아스키코드는 0~255까지 할당된 역할들이 있죠.
(공격 범위 추측) 해킹 캠프 ctf 플래그 관례상 첫 번째 문자부터 특수문자가 들어갈 일은 거의 없을 겁니다.
(공격 범위 확정) 십중팔구, (A~Z), (a~z), (0~9)중에 하나입니다.
이렇게 플래그가 뜹니다. (이왕할꺼 파일공유)
리눅스에서 리버싱하는 환경은 익숙치 않아서
문제 루틴도 쉬울 겸 온전한 의미의 '리버싱'을 해보기로 했습니다.
문제를 푸는 동안 리눅스 환경에 익숙해질 수 있었던 것 같습니다!
해캠에서의 풀 수 있는 리버싱 문제는 다 푼 듯 싶습니다!
이런 문제를 준비해주신 스탭님들께 감쟈를 드립니다!
'공부 > CTF 문제 풀이' 카테고리의 다른 글
Ajou OpenCTF 2018 WriteUp [Arm_Reversing] (3) | 2018.09.27 |
---|---|
Ajou OpenCTF 2018 WriteUp [Simple Reversing] (0) | 2018.09.27 |
HackingCamp2018 CTF WriteUp(Yee.exe) (1) | 2018.09.08 |
HackingCamp2018 CTF WriteUp(ILoveRegistry) (2) | 2018.09.07 |
HackingCamp2018 CTF WriteUp(JavaEasy, ppt 포함) (0) | 2018.09.06 |