OutDoorFrog의 리버싱 이야기

HackingCamp2018 CTF WriteUp(ILoveRegistry) 본문

공부/CTF 문제 풀이

HackingCamp2018 CTF WriteUp(ILoveRegistry)

OutDoorFrog 2018. 9. 7. 02:26

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


오늘은 제가 ILoveRegistry의 구조를 리버싱하며 삽질을 해볼려고 합니다!




주의 : 고인물의 문제를 푸는데 탄성이 나올 수 있습니다.

문제 푸는 데 이런점을 느꼈고, 출제자의 의도는 이런 것 같다는 일기입니다.



제가 CTF에 대해서 상위권을 노리는 참가자출제자의 입장을 생각해봤습니다.




상위권을 노리는 참가자쉬운 문제를 빠르게 풀어퍼스트 컨쿼러 같은 이득을 취하고 어려운 문제로 넘어가는 것이 중요합니다.


출제자그러 입장의 노련한 참가자를 막기 위해 점수를 얻는 것을 지연하는 것이 중요합니다.


  1. 안티 디버깅 첨가하기

  2. 처음보는 유형의 문제 만들기

  3. 디버깅 파일들의 환경을 제각각으로 만들어 놓기

  4. Fake_Flag 집어넣기

  5. etc...


해킹 캠프에서 리버싱 분야의 문제를 풀면서 경험했던 지연 유형입니다.


해킹 캠프보다 더 유명한 대회들은 어떻게 사용자들을 지연할 지 예상조차 힘듭니다.

일단 Writeup빠르게 풀기, 리버싱 하기로 나눠 쓸 예정입니다.



1. 빠르게 풀기(CTF에서는 이렇게 풀자)

문제는 총 3개의 파일로 구성이 되어 있습니다.




  1. Love_Registry(리버싱을 지연시키기는 기법이 매우 많이 들어간 파일)
  2. HACKINGCAMP_Serivce.dll(감이 좋으면 중요하다는 걸 알 수 있는 파일)
  3. DATA(플래그가 들어있는 파일)


1. Love_Registry가 VS2017로 만들어졌고, 32bit 환경에서 debug 할 수 있음


2. 32bit에서 작동이 가능한 DLL이며 리소스가 존재함


3. 플래그가 있을 수도 있는 파일


4. bintext로 문자열 추출, 플래그로 의심되는 문자열2개 발견


5. 플래그로 의심되는 문자열1 디코딩, base64로 인코딩한 것이 아닌가 봅니다.


6. Hxd로 플래그로 의심되는 문자열2 확인, (덤프 파일이 낚시일 확률이 높음)

 



이런 식으로 낚시 파일을 넘겼다면 저의 입장에서는 

2시간 이상을 절약했을 겁니다.


리버싱 실력을 기르는 입장에서는 지양해야할 행동이지만

CTF를 푸는 입장에서는 지향해야할 행동인 것 같습니다. 


7. Resource Hacker로 DLL 파일의 리소스 확인



운이 좋게도 그 때의 저는 PE 파일 구조를 역순으로 

저장한 파일을 발견할 수 있었습니다. 


하지만 파일을 다시 복원하기 위해 팀원에게 부탁해서 원복 코드를 C로 

만들었는데 시간이 굉장히 소모됬었습니다. 


C는 굉장히 솔직한 언어인 반면에 

CTF를 풀기 위해서 사용할 언어로써는 부족한 듯 싶습니다.


친구의 조언, 해킹캠프에 Writeup, CyKor 팀원님이 문제를 푸는 모습을 보니 Python을 자주 사용하는 모습이 보였습니다.




8. 파이썬으로 파일 원복



C언어로는 20줄 이상python으로는 10줄도 안됩니다.


파일 포인터를 파일의 끝으로 이동시켜서 새로운 파일에 끝부터 처음까지의 데이터를 집어넣는 것을 표현해야하는 C언어에 비해서


Python은 '::-1'로 표현을 끝냈습니다.


만약 Python으로 알고리즘을 짰다면 20분 이상의 시간을 아꼈을 겁니다.


9. Detect It Easy로 원복한 파일 확인



64bit로 디버깅 환경이 바뀌었습니다!


64bit 디버깅 환경을 준비하지 못했고, 준비에 시간을 잡아먹었습니다.



10. 사용법 확인(DATA 파일에 플래그가 있습니다)



그 때의 저로써는 여기까지가 한계였습니다


리버싱을 하기 전 최대한 많은 정보를 뽑아낼 수 있는 도구, 

문제 풀이에 적합한 사용자에 가까운 언어, 

미리 준비되어 있는 디버깅에 적합한 환경,


해킹 캠프를 준비할 때 챙길 수 있었던 것 이였습니다.


 다음 대회 참가 때는 반드시 달라져야겠네요.




11. IDA로 출력 부분 확인 (아마 여기가 Main 함수일 것입니다.)


argc의 값과 2를 비교해서 2가 아니라면 loc_1400011E1으로 넘어갑니다.


2가 맞다면 call sub_140001070이 있는 부분으로 넘어갑니다.


srand(0x1000) 인 것을 봐서 고정값을 반환할 것입니다.



12. IDA로 srand와 rand함수를 이용한 연산 행위를 확인


call sub_140001070을 따라 들어가서


rand 함수를 써서 값을 받은 후 나머지를 구하는 행위를 합니다.

나머지를 구한 값에 10(0xA)을 더합니다.


(printf 문으로 이 값도 출력해주셨네요.) 

 



13. IDA로 문자열 Xor 부분을 확인


1,3,5,7... 문자열의 홀수번째 문자들과 14랑(0xE) xor를 하고 있는 모습을 볼 수 있습니다.


(1부터 41(0x29)까지 이 행위를 반복하는 것 같습니다.





14. XOR의 특징을 이용한 문자열 복호화 루틴 생성 및 정답 확인

 

XOR의 특징이 연산에 사용된 값 2개만 알아도 나머지 하나의 값을 알 수 있습니다.


67(0x43) ^ 14(0xE) = 87(0x57)

67(0x43) ^ 87(0x57) = 14(0xE)


이런 특성 때문에 암호화나 문제에 많이 사용될 수 있는 것 같습니다.


어셈으로 알아낸 코드를 C로 만들겠습니다.



출력 결과를 확인합시다.



악성코드를 분석하는 것을 꿈꾸는 사람으로써 안티 디버깅이 섞인 문제,

이런 어려운 문제를 언제나 최적화된 패턴으로 풀어내고 싶네요!


출제자(스탭)님의 WriteUp입니다.(제 롸업은 문제의 절반을 빼먹었네요 ㅋ)





윈도우 리버싱에 올인 하는 사람으로써, 리버서로써


CTF에 참여한다면 고정적으로 2개 이상은 풀 수 있어야한다고 생각합니다.


가야 할 길이 멀군요. 노오오력해야겠습니다!


Comments