Codegate2017 Hello Protector

By bpsec | April 3, 2017

Ram G Thunder 출제자 롸업





출제자 slimV


사실 문제를 내려는데 마땅한 아이디어가 없어서 날로 먹기 좋게 생긴(?) 프로텍터를 갖고 왔다. 코드야 짜면 그만이고 버튼 하나로 리버싱하기 극혐하게 변신시켜주는 프로텍터 캬

사실 요즘 백신은 코드사인 없이 프로텍터로 보호된 실행파일은 그냥 악성으로 잡아버려서 악성코드에 프로텍터 씌우기가 한참 유행하던 2000년대 초반에 비해선 영향력이 많이 줄어들긴 했다. 그래도 내가 잘 우려먹고 살고 있으니 패스




문제정보

  • HelloProtector
  • Windows PE 리버싱
  • 짧디 짧은 코드 하나 대충 만들고 프로텍터만 씌웠음
  • 예상보다 푼 팀이 적어서 여차저차 세이프




풀어본다



아이콘도 따로 없는 날로 만든 실행파일이다. 심지어 코드사인이 없어서 백신이 잡는다 와우



백신이 잡아서 기분 나쁘니 실행하기 전에 실행파일의 정보를 알아본다.



더미다 2.x 버전이라고 한다. 이제 내가 얼마나 양심 없이 문제를 냈는지 확실히 알 수 있다.

어차피 실행파일이 악성은 아니니 그냥 실행해보면 그냥 창이 하나 뜬다. 그 외에 따로 조작이 가능해 보이지 않는다. 뜯어보자.



디버거로 실행파일을 열어보자. 최소한의 양심으로 안티 디버깅은 다 꺼놨으므로 잘 붙는다. 실행도 된다. 이제 뭘 하라는건지 찾기 위해 코드를 살펴보자. 디버거는 간지를 위해 윈디버거를 사용했다



빨간 네모상자 안의 코드가 보이는가. 그렇다 나 양심 없다. API 난독화가 적용된 모습이다.

사실 문제 오픈되고 5분안에 풀릴까봐 쫄아서 옵션 켰다.

나머지 코드를 아무리 살펴봐도 사용자 함수 가상화의 흔적은 보이지 않는다. 가상화 키면 사실 나도 못 풀어서 옵션을 킬 수가 없었다.

코드를 살펴본 결과 안티 디버깅과 사용자 함수 가상화는 꺼져있고, API 난독화가 켜져 있다. 사용자 함수 가상화만 꺼져있으면 임포트 테이블을 제외하고 나머지 영역은 원본 복구가 가능하므로 그냥 언팩하자



언팩했다.

…ㅈㅅ

언팩은 버리고 그냥 코드를 보자.

대충 훑어보니 의도치 않게 수많은 사람들을 낚았던 문자열이 보인다.



“축하! 키 찾았네!”

사실 저 문자열 보고 저기서부터 문제를 풀어나가라고 일부러 눈에 띄게 넣어놨었는데 다들 키 값인 줄 알았다더라.

저 문자열을 쓰는 코드를 한번 보자.



제일먼저 ecx에 “축하”를 넣고 웬 값이랑 비교한다. 아래쪽 루프는 대충 봐도 strcmp처럼 생겨먹었다. 그럼 저기 0x403020에다가 “축하”를 집어넣고 실행해보자.



와우

뭔진 몰라도 와우

“축하”가 키가 맞나보다.

다시 말하지만 님 낚임.

위의 코드 살짝 위를 보면 함수주소 0x4011a0를 호출한다. 얘가 진짜임



함수주소 0x4011a0의 코드가 생각보다 길어서 그냥 대충 정리하면 네모상자 안의 코드로 표현 가능하다.

헬프b.png

위의 함수가 실행되기 전의 arr1은 0으로 초기화 되어있고, arr2의 값은

\x37\x06\x10\x66\x3a\x38\x50\x4d\x02\x01\x63\x01\x36\x63\x53\x7f\x4a\x62\x4b\x2d\x4d\x64\x76\x7d\x25\x75\x5e\x6e\x74\x0c\x7c\x18


여기서 함수가 끝날 때 arr2의 값이 “축하”가 되면 와우

xor의 특징을 활용해 인자를 소거하면 진짜 키가 나온다.



진짜 키 값은 “TbH_iDk_h0W_1t_R3AlLy_W0rk5.. :<”



이제 와서 다시 깨달은건데 문제 정말 날로 낸듯…




여담

사실 위의 식에서 전역변수인 g_tbuf는 사용자의 환경에서 데이터를 가져온다. 하지만 API 난독화가 걸려있는 상태에서는 해당 함수가 어떤 함수인지는 파악하기 어렵다. 그런고로 다시 언팩



언팩해서 다시 키 검사하는 함수를 보면 GetVolumeInformationWStub를 호출하는게 보인다. 대충 설명하자면 현재 실행파일이 저장된 디스크의 볼륨 명을 가져와 키 검사에 쓴다. G_tbuf에 볼륨 이름이 들어감

그래서 볼륨 명에다 진짜 키 값을 집어넣고 실행하면 와우



문제 푼 팀 중에 볼륨 명을 가져다 쓰는걸 찾은 팀이 있던데, 언팩해서 찾은건가.

여튼 끝!

comments powered by Disqus