OutDoorFrog의 리버싱 이야기

keris 정보보안경진대회 예선 Writeup [Asm, Guava, MySerial] 본문

공부/CTF 문제 풀이

keris 정보보안경진대회 예선 Writeup [Asm, Guava, MySerial]

OutDoorFrog 2018. 11. 5. 04:27

안녕하세요! 재활치료 중인 개구리입니다!

운동 이모티콘에 대한 이미지 검색결과




세미나 참가 이후...

정보보안 영재교육원에서 정보보안경진대회를 개최했었습니다.


저는 비록 교육원생은 아니지만
Demon팀원 한 분과 갓갓 한 분에게 바이너리 파일을 제공해달라고 요청했습니다!

구걸에 대한 이미지 검색결과

그리고 간곡한 요청에 마음 넓은 두 분께서 파일을 제공해주셨습니다!



1. Asm


picoCTF 때 많이 경험해본 문제 유형입니다.(어셈 코드만 주기)



파일 시그니처를 파악하기 위해 010 editor로 열어보았습니다.




파일 시그니처 대신 귀여운 gdb로 main 함수를 disass한 데이터를 제공했더군요.


대신 귀여운에 대한 이미지 검색결과


cmp 명령어 이후 jne 명령어를 사용해서 분기점을 만들어주는데..


cat flag라는 문자열을 입력했는데 Wrong... 이라는 문자열이 출력된 모습이 보이고..


%d가 출력된 것으로 보아 정수 형식으로 입력해야하는 듯 합니다.








Hex 값 0x1C05523을 계산기를 이용해서 간단히 10진수로 변환해줍니다.







이런 문제류는 숫자를 플래그로 줄 때 8자리 숫자로 답을 주던 특성이 있더군요.


PicoCTF에서 1000줄 이상의 어셈 문제를 풀어본 적이 있습니다.


그 때 따로 트레이서를 만든 생각이 나는군요. ㅎㅎ



2. guava.exe


구아바에 대한 이미지 검색결과


출제자님도 구아바의 맛을 아시는가 보군요 ㅋㅋ (맛있습니다)



여담이지만 구아바 잎은 깨끗이 씻어서 차로 끓여 드시고

구아바는 껍질을 잘 깍아서 먹으면 몸에도 좋고 맛있습니다.




IDA로 디컴파일 해봅시다.


(Windows, 32bit에서 실행 가능한 문제입니다.)




사용되는 변수, 상수 입니다.








플래그에 사용될 수 있는 문자 데이터들을 str_data에 옮깁니다.


값을 입력해달라는 문구를 출력해주네요.(구아바가 인삿말이군요 ㄷㄷ)





30의 크기를 가진 문자열을 입력받습니다!


총 25개의 조건식이 존재하기 때문에 우리는 문자열의 크기25라는 것을 유추할 수 있습니다.


플래그에 사용될 수 있는 문자의 데이터입력받은 문자열을 따로따로 비교해서


전부 조건에 부합하다면 congratulations 라는 메세지박스를 띄어줍니다.




Input 값을 0123456789ABCDEFGHIJKLNMO로 입력해주고 조건에 따라서

디버거의 패치 기능을 이용해 Input 값을 변경해주는 식으로 진행했습니다.



순번에 맞지 않게 문자들을 비교하기 때문에 시간을 조금 많이 잡아먹은 문제입니다.


트레이싱 감각이 조금 돌아온 느낌입니다!




Flag{Go_4head_make_YouR_DaY^^X}




안티 리버싱 기법을 추가하고 복호화 과정을 한번 더 거치게 만들면


CTF에서 바로 리버싱 문제로 활용할 수 있을 것 같습니다.



3. MySerial



시리얼을 생성해주는 문제입니다. ㅎㅎ

리버싱할 때 라면 하나 먹으면서 진행하면 기분이 매우 좋습니다!


삼양라면에 대한 이미지 검색결과


IDA랑 문제랑 섞어먹어 봅시다.





사용하는 변수, 상수입니다.





(몇몇 변수, 상수 이름은 제가 따로 네이밍해줬습니다.)




출력해주는 부분입니다.





입력, 검증 부분입니다.



31개의 문자를 입력받습니다.


break_var의 값을 1씩 낮추는데 이 루프가 끝난 후 값은 -33이더군요.


미리 정해진 값 -1, 문자열 갯수 -31, NULL -1, -33이 나오네요.




문자열의 갯수 31개라면.


브런치오사우루스(??), 티라노사우루스라는 데이터를 가진 문자열 초기화해주고


입력받은 0번째 문자부터 브런치오사우루스(원래 14자) 12자 xor 해줍니다.


30번째 문자부터 역순으로 티라노사우루스(원래 14자) 12자 xor 해줍니다.


0번째 문자부터 11자29를 더해줍니다.


12번째 문자부터 9자9를 빼줍니다.


22번째 문자부터 7자34를 더해줍니다. 




문자열 갯수31이 아니라면 


31자가 아니라고 판단하고 종료합니다.




어떻게 시리얼을 만드는지도 알았겠다...


이대로 역연산만 진행해서 입력값을 도출해내면 되겠군요...


음... 이런 문제는 보통 입력한 시리얼을 주어야 되는데.. 


시리얼이 없더군요..




속았지에 대한 이미지 검색결과



제 착각이였습니다.ㅎ


시리얼 : '8iJy$+oiI_=TY*d#9=:9N.bdLL0?=u


이제 역연산 코드를 짜봅시다.




역순, 작업을 거꾸로 해서 원래 평문으로 복원해줍시다.






실행해봅시다.



FLAG : Hi-N4na!-YOU-c4n-C411-m3-DDoobT


무결성 검증은 프로그램을 다시 돌려보면 되겠죠?



끝났습니다.


3문제 다푸는데 1시간 반정도 소요했습니다.


안티 리버싱 기법을 적용하지 않는다면 z3, Angr를 쓰도록 개조하거나


적용한다면 여러 기법을 적용해서 분석을 지연시키는 것이 나을 듯 합니다.




예선에 맞는 난이도의 문제인 듯 싶습니다.


하루 빨리 다른 언어의 리버싱 방법을 익히고, z3, angr에 익숙해져야 

리버서라는 이름에 걸맞는 실력에 한 발짝 내딛을 수 있을 듯합니다.





현재 erebus 악성코드 분석이 진행 중이며


윈도우 아키텍처 설명은 조금 더 쉽게 설명을 해드리기 위해서 

여러 외국 자료들과 발표 자료들을 살펴보는 중입니다.


샌드박스 구현 프로젝트는 조금 더 시간이 있어야 할 듯 싶네요.


제가 아는 친구랑 웹 클라우드 서비스를 구축하고 취약점 분석을 같이하기로 했는데


클라우드 아키텍쳐와 오픈 소스를 살펴보니 기한을 조금 더 늘려야할 듯 싶습니다.


BOB 내부 CTF 문제도 풀고 싶은데... 아마 BOB 내부 인원이 아니면 안되겠죠??



화이팅에 대한 이미지 검색결과



하루 빨리 BOB 8기 모집일이 다가왔으면 좋을 듯 싶네요.

Comments