Codegate2017 RamGthunder

By conchi | March 27, 2017

Ram G Thunder 출제자 롸업



안녕하세요 :D
오랫만에 등장한 콘치입니다!
되게 오랜만에 보는거 같아요ㅜㅜㅜㅜㅜㅜ
넘나…반가워요 뽀잉!

그.. 언제냐.. 지난달에 열렸던 Codegate2017 예선은 어찌 재밌었는지요..?
핫핫! 그거아세요?
콘치도 예선 문제를 출제 했었습니다!!!(꺄르르르륵)
아무도 몰랐겠지만 후후.. 참트루입니다.
자 그럼 상상도 못했을!
콘치의 100% 출제자 관점 문제 풀이나갑니다
는 귀찮다…ㅎㅎ..





RamG-Thuner



제가 낸 문제의 이름은 RamG-thunder 였습니다.
제목만 봐서는 정말 누가 냈는지 모를 정도의 문제 아니었나요?ㅎㅎ?
껄껄 대회 시작과 동시에 등장한 정체불명의 Reversing 문제였습죠.
뭐 문제에 대한 비하인드 스토리가 많으니 보다가 끄지마시고 끝까지 봐주시는걸로…
이런 이야기는 나중에 하는걸로 하고 문제를 보러갑시다.




문제 정보

  • RamG-thunder
  • Reversing이라 하기 민망하지만 굳이 정하자면.. Reversing 에 가까움
  • windows 32bit PE 바이너리(.exe)
  • 분석환경 : windows7 32bit




분석



여기에 작고 귀여운 바이너리가 살고있습니다. 더블클릭해서 보면 뭔가 이상한 계산기인척 하는 작고 귀여운 바이너리 입니다.



1, 2, 3, 0 총 네개의 메뉴를 가지고 있는 수상한 계산기라고 하네요.



뭐 실행해서 동작을 확인해보면 이런식으로 키를 입력하고, 평문도 입력해 주는 부분이 등장하는데, 아무거나 입력해주고 3번을 눌러 파워 XOR을 시전하면!
뭔가 XOR된 문자열이 출력하는게 전부인녀석입니다.
근데 뭐 계산기 이름을 보고있자니 뭔가 수상한 계산기라고 합니다.
바이너리를 좀더 자세히 볼 필요가 있어보이는군요?

만만한 Ollydbg에서 열어서 동적 분석을 한번 해봅시다.



아주 하이룽(?)한 상태입니다. F9를 눌러서 실행해볼게요!



뭐 별 문제 없이 실행도 잘되네요.
(희희 안티디버깅도 없나~? 희희?)
그럼 한번 낱낱히 분석해봅시다 :)
우선 메인동작을 하는 함수를 CALL하는 부분을 찾아줍시다.
몇번 F8을 갈겨대다(?) 보면 어떤 주소를 CALL할때 갑자기 아까 처음에 봤던 계산기 메뉴가 뜨는게 보일거에요. 그부분을 기억해두셨다가 따라 들어가봅시다. (F7을 눌러 함수안으로 들어가면 됩니다.)



main으로 추측되는 함수 안으로 들어온 모습입니다. 오오 낯익은 메뉴가 출력될것으로 보이는 함수들이 들어있네요. 어떤 동작을 하려나 대충 어셈만 한번 눈으로 슥-삭 해봅시다. 는 잘 모르겠네요. 그런데 슥-삭 하다보면 이상한 부분을 발견할 수 있습니다.



엥? 분명 메뉴에는 1,2,3,0 요 네개의 숫자만 각각의 역할을 하고 있댔는데 입력한 값이 4인 경우를 체크하네요(?) 바탕화면으로 나가서 시작 메뉴에서 4번을 눌러 어떤 일이 발생하나 확인해보도록 합니다.



오잉? 4번을 눌렀더니 히든메뉴가 등장했네요 이게모다.. 각각의 메뉴를 눌러서 뭐하는놈인지 체크를 해봅니다.



나름의 도움말이랍시고 들어있는 옛날 노래가사의 일부인듯한 도움말과 말인지 방구인지 모르겠는 행운을 빈다는 축복까지!



2눌러 노잼일거 같은 플래그 찾기 게임을 시작하면 키1을 입력받습니다. 아무거나 입력하고나면 2, 3, 4 스테이지가 지맘대로 지나가고 스테이지 5라면서 key5를 입력하라고 합니다. 그러고나면 뭐 별 반응이 없네요.

그런데 문제 바이너리가 있던곳에 뭔가 수상한 일이 생깁니다.



c라는 작고 귀여운 바이너리가 하나 떨어졌네요 ㅎㅇㅎㅇ? 얘는 뭐하는 애일까요?



는 모르겠듭니다 ‘ㅅ’a…

콘치의 의도는


뭔가 스테이지를 거친다 -> 파일이 떨어진다.

즉, 스테이지를 만족하는 값들이나 어떤것들로 인해 c가 영향을 받는다


라는걸 여러분들이 추측해내서 바이너리를 리버싱 하여 정상적인 c파일을 알아냈으면 했답니다.

다들그렇게 푸셨나여 ‘ㅅ’? 사실 푸는 방법이 다양한 그래서 쉬운 난이도였던 문제라 방법은 겁나 다양하겠지만~ (사실 어떤방법으로 풀어도 쉬운 문제이긴 했습니다 껄껄) 콘치가 생각했던 방법대로 한번 풀어봅시다.




Stage 1



첫번째 스테이지의 핵심이에요.
요부분을 위주로 분석하시면 됩니다.
xor구문을 지나기 전에 eax에 셋팅되는 값들을 확인해주시면 되요.
(0x34. 0x37, 0x34, 0x35, 0x39가 반복됨)
eax에 보면 반복문을 돌때마다 뭔가 숫자가 들어가는걸 확인할 수 있어여.
반복문이 끝나면 PUSH명령어를 통해 EAX에 “MVYLXYUARJ”라는 문자열이 들어갑니다.




ㅎㅎ..느낌이 쌔하지 않나여?
eax에 때려박히던 16진수 숫자들을 10진수로 바꾸면
47459가 되고, 이녀석들과 MVYLXYUARJ라는 문자열을 XOR해주면!
yamyambugs 라는 문자열이 완성됩니다 ㅎㅎㅋㅋ…!
요 문자열이 첫번째 스테이지를 넘어가는 Key1이 되었습니다.




That’s nono

이건 안티디버깅 당했음을 알려주는 문자열이었습니다.
사실을 안넣을랬는데.. 이것도 비하인드 스토리가 있는 부분입니다.
다들 쉽게 눈치채셨을거라 믿어요.
IsDebuggerPresent()함수를 이용하여 안티디버거를 넣어두었습니다.
이부분은 TEST EAX, EAX를 XOR EAX,EAX로 바꾸거나,
아주 확실하게 그냥 BeingDebugged 멤버의 값을 바꿔버리는 등 여러가지 방법을 이용하여 우회할 수 있었습니다.




stage 2, 4


[stage 2]의 부분


[stage 4]의 부분


이 부분들은 동일한 mac address위치에 있는 다른 숫자들을 가지고 오는 부분이었습니다.

Mac address의 첫번째, 두번째, 세번째의 숫자들을 가지고와서 체크하는 부분이었는데, stage 2에서는 200(0xC8), 89(59), 120(78) 과 같은지 비교하였고, stage 4에서는 00(0x00), 12(0x0C), 41(0x29)과 같은지 비교하였습니다. 뭐 아시는분들은 잘 알겠지만 stage 4의 Mac address는 vmware에 로딩된 윈도우에 할당되는 mac address의 일부였습니다 ㅎㅎ!




stage 3

이 부분은 레지스터와 관련된 부분이었습니다. 해당 조건에 따라 “hel”, “wor”, “fis” 총 세가지 값을 뽑아내는 부분이었습니다. 풀이는 상당히 간단했습니다.

실제로 조건에 따라 레지스터에 해당 키와 해당 값들을 만들어주거나, 람쥐신에게 기도 후 셋중 느낌이 오는곳으로 가는 점프문을 수정하거나, 세가지의 경우를 다 돌려보는(?) 그런 경우가 있었겠군요.



결론은 HKEY_CURRENT_USER아래에 Hellow라는 Key가 있어야 하고,
그 아래에 hellow_FishWorld라는 value가 있어야 했습니다 :)
그러면 hel이라는 값을 가지고 갔겠군요 ㅋㅋ!
풀이를 보면 볼수록 뭐 이런 쉬운 문제가 다있어! 라는 생각이 들고있겠쬬 후후..?




stage 5

대망의 stage5네요. 이 부분은 아까 stage1과 동일한 방법으로 풀어주시면 되었습니다!
입력한 문자를 바이너리 안에 들어있는 키와 xor하여 변경된 문자열과
제가 지정해둔 문자열의 5자리가 일치하는지 체크하는 부분이었습니다.
이부분은 hello를 입력하면 정상적인 키의 일부를 얻을 수 있었습니다.




flag

요렇게 각각의 조건에 맞추어 문제풀이를 진행해주시면 바탕화면에 여전히 작고 귀여운 c라는 이름을 가진 바이너리가 생기는데 출제자가 원하는대로 해줬다면! 요 바이너리를 hxd에 올려보았을 때!


이렇게 수상한 png파일로 바뀌어 있는것을 확인할 수 있었을거에요! ㅎㅎ! 얘를 c.png로 바꾸어주면!



이렇게!
플래그가 나타나고!
문제는 끝이 나는!
넘나!
간단한!
문제였습니다 짝짝짝 !!


+) 그저 stage만 넘어가면 플래그가 나올 줄 알고 파!워!점!프! 를 통해 조건문들을 우회하면 일부로 값이 안나오게 모든 조건에다가 경우의 값을 걸어둔 끄음찍한(?) 문제였습니다 호호ㅅ_ㅅ!




문제적 비하인드 스토리


ep01.



사실 처음에는 주니어/일반/대학 이렇게 따로 문제가 만들어 지는 줄 알고 콘치는 주니어 친구들 모두가 풀 수 있을만한 꿈과 희망이 가득담긴 문제를 만들고 있었습니다. 그런데…. 끠?… ㅅ..시간만 다를뿐.. 문제는 동일하게 출제 된다고… 나는..너무늦게 알았을 뿐이고… 동공이 흔들릴 뿐이고… 그래서 제일 처음! 몸풀기 문제로 출제 되었다는 후문이…




ep02.



문제가 9시에 오픈되고..
나온지 13분만인가 풀려서 로그를 확인한 콘치는 그자리에서 벌떡 일어나!!
오옷! 이거슨 검증된 문제에요!! 제문제에는 더이상 문제가 없어요 (크흡) 전이만!!
하고 모두의 부러움을 산 후 퇴근을 꿈꿨으나 다음날 9시에 퇴근했… ㅎㅎ..;;
(제가 문제 검증할때도 13분은 더 걸렸는데 어떻게 푸셨는지 저 또한 넘나 궁금합니다 ㅜㅜ.. 넘나..대단한것…)




ep03.



문제 제목인 RamG-thunder의 의미를 파악하신 분들이 몇 계시더군요..
저만알줄..알았는데… ㅎㅎ…(씁쓸…)
는 무슨 알아주셔서 감사합니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ(감동)
비슷한 이름을 가진 우리 미드필더님.. 이번시즌.. 힘내주세요…
4등만큼은.. 참을수없음..(???)
(??? : 키킥~ 난 미드필더라구~ )




ep04.



그냥.. 저는 윈도우에서 사용되는 이런저런 저런요런 기능들을 오목조목 넣은 간단한 C프로그래밍을 했을뿐인데…
IDA로 못보게 하려고 난독화를 하러 갔더니..
이미 헥스레이가 자기 마음대로 해석해놔서…
라이트업 쓸 때 헥스레이를 못보고 썼다는 후문(????????)
본격 실제 코드는 간단하지만 어셈이 더러운 혼종
라이트업쓰는데 어셈보느라 너무 고생했다며…(??????????)




그저 콘치는 모두가 한 문제는 풀 수 있는 대회가 되었으면 하는 아주 미니미한 소망을 가지고 문제를 만들기 시작 했었습니다.
모두에게 꿈과 희망을 줄 수 있는 문제가 되었으면 하면서 만들었는데 어째 모두의 꿈과 희망과 자신감이 되었는지 모르겠습니다 히히!

콘치의 롸업은 여기까지에요 :)
예선에서 재밌게 문제를 풀어주셨던 분들 모두모두 감사하고 고생들 하셨습니다!
문제 풀어주어서 감사해요 :-D

뿅!



comments powered by Disqus