OutDoorFrog의 리버싱 이야기

HackingCamp2018 CTF WriteUp(Yee.exe) 본문

공부/CTF 문제 풀이

HackingCamp2018 CTF WriteUp(Yee.exe)

OutDoorFrog 2018. 9. 8. 23:37

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


해킹 캠프가 열린 후 벌써 6일이 지났습니다.

1일만 지나면 해킹 캠프 문제 서버가 닫히는데요.

제가 풀지 못한 문제는 인증해야 속이 시원할 것 같습니다.(잠도 오고)



문제 풀이를 시작하겠습니다.



1. Detect It Easy로 디버깅 환경 결정



Windows7 32bit 환경에서 분석해보겠습니다.

EP는 Default, 섹션의 수는 9개... 특이합니다.(기억해둡시다.)



2. PEViewer 사용



섹션의 갯수가 특이해서 PEViewer로 까봤습니다.


스탭님께서 Write Up을 발표하실 때 귀담아 들었습니다.


TLS 콜백더미 코드 같은 안티 디버깅 기법이 숨어있다는 것을 말이죠.


안티 디버깅을 패커 이외에는 경험해본 적이 없습니다.(청정수)


구글신에게 질문합시다.


3. 구글신님 소환



Ezbeat 님의 블로그(TLS 콜백에 대한 글)


내용을 요약해보자면


EP에 오기 전에 실행되기 때문에 디버거의 설정을 바꿔줘야합니다.


디버깅 옵션 탭에서 이벤트 탭으로 들어간 후 System breakpoint에 체크


사용된 안티 디버깅 기술의 우회 방법을 파악해서 우회한 후 나머지 코드 분석


이런 식으로 요약이 가능할 듯 싶습니다.


출처 : http://ezbeat.tistory.com/165



4. 우회 방법 도출, 


IDA를 써서 TLS 콜백에 어떤 안티 디버깅 기법이 적용되어 있는지 확인하고


우회 기법을 만들어낸 후 플래그를 찾아봅시다.




Export 탭에서 TLScallback_0를 발견 (좀 더 살펴봅시다)




TLScallback_0_0으로 점프하고 있습니다.



GetModuleHandleA로 Kernel32.dll의 시작 주소를 구하고 있습니다.




GetProcAddress로 Sleep 함수의 주소값을 구하는 듯 싶습니다.



음..? VirtualProtect를 호출하고 있군요.




문자열에 값을 옮기는 행위한 후 다시 VirtualProtect를 사용합니다.



중간중간에 Fun1을 호출한 후 마지막에 Fun2, Fun1을 호출하고 종료됩니다.



Func1과 Func2를 살펴보고 판단해봅시다.




(이 함수가 굉장히 많이 호출이 됩니다.

Input에 aaaa를 넣고 트레이싱해보니 전부 bnd retn으로 가더군요.)


TLSCallback 함수를 지나고 나면 Main 함수를 호출합니다.



음..? Memset함수를 호출하는 군요.(문자열 초기화??)



Input을 출력한후 wscanf로 유니코드 형태의 문자열을 받습니다.






strcmp를 커스텀으로 만든 함수를 호출하더군요.


그래서 eax의 값과 1을 비교해서 성공했는지 실패했는지 비교합니다.


결과를 출력해준 후 Main함수가 끝, 프로그램은 종료됩니다.




메인이 끝난 후 프로그램이 종료됩니다.


흐름을 정리해보겠습니다.


TLSCallback 루틴을 지나갑니다.


Main 함수에서 입력받은 유니코드 문자열을 커스텀 Strcmp를 거쳐 

결과값을 eax레지스터에 저장한 후


결과를 판단해서 정답을 비교해주는군요.


커스텀 Strcmp 함수를 좀 더 조사해봅시다.


rep stosd까지는 스택을 확보하기위한 고유의 초기화 행위인 것 같습니다.


자동으로 만들어진 즉 지나가도 될 코드인거죠.


그 이후.....


유니코드 문자열을 인자로 가지는 sub_411050 함수를 호출합니다.


StrcmpInteral이라고 이름지어 줍시다.(헤헷)


그 이후 Func1을 호출한 다음 끝이 납니다.


StrcmpInternal을 조사해봅시다.



또 다른 함수를 불러준 후 끝나는 군요.


RealStrcmpInternal이라 이름짓고 갑시다.





함수가 복잡해서 그래프로 모양을 알아봅시다.




문자열이 하드코딩된 부분입니다.(출력해봤는데 깨집니다.)




"H,C,A,M,P,{" 와 문자열을 비교하는 곳입니다.


플래그 형태가 HCAMP{flag} 형태이니 확실하군요. 




lrotl 함수를 호출합니다.


값을 n Bit 만큼 왼쪽으로 옮겨주는 역할을 합니다.


1 byte씩 점검해주는 코드도 있더군요.


구조를 대강 이해했으니 복호화 코드를 만들어봅시다.



Irotr함수를 이용해서 Irotl함수가 shift연산한 만큼 복호화 시켜줍시다.


그리고 그걸 출력해준다면??


답이 나옵니다!!!




이 문제를 풀면서 느낀 점은 우리가 자주 사용하는 함수를 직접 만들어서

이해를하고 어셈블리어에서 구현한다면... 좀 더 문제를 풀 때 어셈을 잘 파악할 수 있을 것 같습니다.


다음 포스트는 악성코드 분석 환경 준비,

앞으로 CTF 참가할 때 준비할 환경 ,

제가 진행해야할 앞으로의 공부 방향에 대해서


다루도록 하겠습니다. 








해킹 캠프 스탭님들!! 

이런 좋은 문제를 만들어주셔서 감사합니다!

Comments