BLOG main image
분류 전체보기 (222)
Reversing (13)
Pwnable (4)
Linux Kernel (3)
Crypto (2)
Wargames (66)
Programming (18)
Write Up (32)
Project (22)
Web (2)
My Life (52)
Memo (3)
etc (2)
발표자료 (1)
36,063 Visitors up to today!
Today 12 hit, Yesterday 30 hit
daisy rss
tistory 티스토리 가입하기!
2015.07.26 23:57


이번에는 AVReversing입니다. 이름부터 AVR바이너리임을 짐작할 수 있어요.

AVR바이너리를 디버깅 하는 방법은 나중에 따로 포스팅 할 것이기 때문에 별다른 언급은 하지 않겠습니다. 먼저 IDA로 열어봅시다.


문자열도 깔끔하네요. 먼저 간단하게 요약을 해 보자면


여기 sub_1EF함수를 호출할 때 "input: "이라는 문자열을 출력해 줍니다. 그리고 


sub_5B6함수에서 입력을 받습니다. 입력한 Input값은 


메모리 0x1096에 위치하게 됩니다. 그러고 난 다음에 


sub_8A함수에서 모든 연산이 일어 납니다. 핵심 함수에요.


sub_8A함수의 전체적인 모습입니다. 200점짜리 문제라서 그런지 루틴 자체는 그렇게 어렵지 않습니다. 분석을 해 보자면 


이 부분에서 Input의 글자수가 26글자인지 비교하구요.


이 부분에서 입력한 Input값들을 루프를 돌면서 각 글자들과 루프 카운트를 xor시켜줍니다. 그리고 마지막으로


여기서 각 값들을 16진수의 16의 자리수와 1의 자리수를 바꿔 줍니다. 0x31은 0x13 이런 식으로요.


그리고 최종적으로


이 sub_180함수에서 원래 존재했던 테이블 값과 비교를 합니다.


0x27부터 0x02까지가 테이블 입니다. 이제 간단하게 소스를 짜 주면


이렇게 키가 나오게 됩니다. 사실은 인풋 키가 플래그이기 때문에 저 값이 최종 플래그가 됩니다.


이번에는 Reversing.kr의 미니 CustomShell을 푸는 듯한 기분이 들었네요.ㅋㅋㅋㅋ

AVR리버싱을 할 줄 알았다면 좀 쉬웠을지도 모르겠지만 접해보지 않았었다면 좀 어려울 것 같은 문제였습니다.


마지막 남은 memmem문제를 풀지 못해서 좀 아쉬웠습니다..ㅠㅠ

리버싱 실력만이 아닌 패킷분석, 메모리 덤프 분석 및 정보 수집, 암호학, 포렌식 등 여러가지 기본 지식이 있어야 풀 수 있는 문제이어야 해서 아쉽게도 풀지를 못했어요.. 나중에 다시 암호학 지식 좀 쌓고 풀어볼렵니다..


Flag : rnenT4L_5tate_I5_rEVErsin9


'Write Up' 카테고리의 다른 글

정보보호올림피아드2015 본선 Q3  (0) 2015.10.17
정보보호올림피아드2015 본선 Q2  (2) 2015.10.17
Layer7 CTF Write-UP  (2) 2015.09.01
YISF 2015 Write-Up 예선  (0) 2015.08.12
[Just For Fun3] Reversing_AVReversing  (0) 2015.07.26
[Just For Fun3] Reversing_Damnida  (0) 2015.07.26
Name
Password
Homepage
Secret
2015.07.26 22:59


JFF3의 Reversing_Damnida 입니다.

먼저 Exeinfo에 넣어보면


64비트 이미지라고 나옵니다. 한 번 실행시켜 보겠습니다.


그 어떠한 것도 뜨지 않고 시커먼 창에 커서만 깜빡이네요.

딱히 찾아낼 수 있는 것이 없어 보입니다. 바로 IDA로 열어보겠습니다.


main함수 내에 1자형으로 쭈욱 이어져 있습니다. 보기 좋네요.

문자열을 찾아 보면


눈이 가는 문자열이 몇 개 보입니다. 저 main함수를 분석해 보면 안티디버깅도

굉장히 많이 박혀 있구요.


의미 없는 분기문들도 보이구요. 


NOP 떡칠한 곳도 보입니다. 난독화가 되어있거나 바이너리에 이상한 짓을 해 놓은 것 같습니다.


좀 더 보면

이렇게 어떤 값을 출력하는 부분도 볼 수 있고


키를 얻었다고 알려주는 부분도 있습니다. 그 다음 저는 x64 Dbg를 이용해서 디버깅을 했습니다.


Entry Point 입니다. 여기서 조금만 진행하면 


이렇게 main함수로 들어가는 부분을 볼 수 있습니다. 들어가고 나서는 IDA와 코드를 비교하면서 프로그램의 흐름이 아까 보았던 Get_Key :) 이 쪽으로 향하게 해 주면 됩니다. 


안티디버깅들도 우회 하면서 잘 따라가 줍니다.

쭉쭉 진행을 하다 보면 갑자기


여기서 K5y Is : 라는 문자열이 보입니다. 언뜻 보면 키를 출력해 줄 것 같으나 페이크 입니다. 어떤 값을 출력해 주기는 하지만 키가 깨져 있구요. 우리는 아까 봤던 Get_Key :)부분으로 가야 합니다. 순조롭게 진행을 하다 보면


갑자기 :( crashed 크래시가 났답니다. 물론 페이크 입니다. 크래시가 났지만 우리는 꿋꿋이 플래그를 향해 나아가 줍니다.


중간에서 귀엽게 IsDebbugerPresent함수도 한 번 등장해 줍니다. 근데 이것도 페이크 입니다.ㅋㅋㅋㅋㅋㅋ 여기서 좀 더 주의해서 보면은 디버깅 중일때는 정상적으로 나아가고 제로 플래그나 분기문을 수정해 주면 exit()함수로 끝내 버립니다. 

아무것도 건들지 말고 쭉쭉 나아가 주면


드디어 Get_Key :)가 나왔습니다. 여기서는 딱히 하는게 없고 더 나아가서 매우 긴 NOP 더미들을 지나가면


이런 부분들이 보입니다. 여기서 ResumeThread라는 함수를 호출하게 되면


이렇게 프로그램이 크래시가 나면서 플래그를 출력해 줍니다. 사실 이 크래시도 페이크 입니다. 저기서 프로그램 닫기 누르고 정상적으로 디버깅을 또 진행할 수 있더라구요.ㅋㅋㅋㅋ


이제 저 값들을 아스키로 변경해 주시면 


이렇게 완성된 플래그가 나오게 됩니다.


Reversing.kr의 미니 Twist1을 푸는 기분이었습니다.ㅋㅋㅋㅋㅋ

문제의 의도만 파악하면 그렇게 어렵지 않게 풀 수 있었을 것 같은데 생각보다 배점이 높더라구요.. 400점...


이렇게 Damnida의 풀이를 마치겠습니다.


Flag : _jfF_M4dC10wn_:)


'Write Up' 카테고리의 다른 글

정보보호올림피아드2015 본선 Q3  (0) 2015.10.17
정보보호올림피아드2015 본선 Q2  (2) 2015.10.17
Layer7 CTF Write-UP  (2) 2015.09.01
YISF 2015 Write-Up 예선  (0) 2015.08.12
[Just For Fun3] Reversing_AVReversing  (0) 2015.07.26
[Just For Fun3] Reversing_Damnida  (0) 2015.07.26
Name
Password
Homepage
Secret
Easy Crack - 100pt
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password