본문 바로가기

Reversing/CodeEngn

[CodeEngn] Advance RCE L10풀이

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com


그림 1

Serial이 WWWCCCJJJRRR일 때의 Name을 구하라고 한다.

Name은 4글자이고 정답으로 나올 수 있는 문자열 중 숫자-소문자-대문자 순서 상 먼저 오는 문자열을 선택하라고 한다.

두번째 힌트는 풀기 전까지 무슨 말인지 몰랐다.

 일단 이해가 안되더라도 실행시켜보자!

그림 2

음,, serial이 틀렸다고 한다.

Name에 맞는 serial이 따로 있나 보다.

분석하기 앞서 exeinfo로 확인해보았다.

그림 3

패킹도 되어있지 않은 것 같고 별 다른 특이점이 보이지 않아서 바로 x32 디버거로 열어보았다.

 

파일을 열어서 실행시킨 후 문자열 찾기로 확인해보았더니 아래의 그림 4와 같이 유의미한 문자열들이 좀 보였다!

아래의 회색으로 표시된 부분에 성공 flag가 있는 것도 확인할 수 있었다!

그림 4

해당 부분으로 이동해서 성공문으로 갈 수 있는 조건을 확인해보니 아래의 그림 5와 같았다.

4020C1로 점프하지 않고 그대로 진행해야 하므로 [ebp-A5]가 0이면 안된다!

 

그림 5


이 부분까지 찾고 다시 처음으로 돌아가서 entry point 부터 메인 함수로 차곡차곡 찾아서 들어갔는데 그 부분은 그냥 실행 화살표 누르면 바로 가기도 하고 오히려 더 헷갈려질 것 같아서 넣지 않았다.

그리고 메인 함수부터 하나씩 분석하려고 다 봤는데 일단 함수들이 매우 매우 길고 봐도 이게 무슨 작업을 하는지 잘 모르겠다,,,

값을 가져오고 값의 주소를 저장하고 또 주소를 저장하고,,, 무한 반복인데 그 사이에서 의미 있는 과정을 찾기에는 지금 실력으로 불가능하기 때문에,,, 이 부분은 빼고 핵심만 보려고 한다.


아 그리고 분석하다 보니 내가 입력한 name과 serial이 어디에 담기고 어디로 이동하고 이걸 찾는게 의미가 없었다. 위에서 말한 것처럼 위치가 계속 바뀌고 이리 저장했다 저리 저장했다 아주 복잡하다.

해서 다른 문제들을 풀때처럼 하나씩 풀어가는게 아니라 하나씩 올라갔다.


이어서 다시 문제로 돌아가자!!

위에서 [ebp-A5]가 0이면 안된다고 했으므로 [ebp-A5]가 어떤 값인지 찾아야 한다.

그림 6

조금 위로 올라가보면 그림 6과 같이 AL 값을 [ebp-A5]에 넣고 있는게 보이는데, 이때 EAX 값은 40144C 라는 함수를 통해 리턴되는 값이므로 해당 함수를 봐야한다.

40144C 함수로 이동해보았다.

 

그림 7

위의  그림 7은 40144C 함수로 이동했을 때의 화면이다.

의미가 있어서 첨부한 사진은 아니고 그냥 이런 모습이라고 보여주기 위해 넣었다.

왼쪽을 보면 모듈분석도 안되고 함수가 엄청 길다.

RET 찾는 데에도 정말 한참을 내려야했다.

 

일단 아래의 그림 8에서 RET를 찾았고 EAX에 [EBP-C4]를 담고 있는 것을 볼 수 있다.

그림 8

그럼 이제 다시 [EBP-C4]에 어떤 값이 들어가는지 확인해야 한다.

그림 9

보기 편하라고 BP를 걸어뒀는데 해당 부분을 보면 [EBP-C4]에 EDX 값을 담고 있고

EDX에는 [EBP-10C]가 담겨있다.

 

그럼 다시 [EBP-10C]가 어떠한 값인지 확인해야 하므로 다시 올라간다~

그림 10

[EBP-10C]에는 EAX가 담겨있고

EAX에는 [EBP-69] 값이 담겨있다.

 

거의 다 올라왔다.

다시 [EBP-69]가 어떤 값인지 찾아 올라가보았다.

그림 11

이 부분은 거의 다 붙어있어서 한번에 가지고 왔다! 맨 아래 BP부터 올라가면서 보면 된다.

아래의 cmp부터 보면 EAX와 5를 비교해서 EAX =< 5 이면 401865(살짝 잘렸는데 맨 아랫줄이다)로 가고, EAX > 5 이면 [EBP-69]에 0을 담고 있다.

그럼 EAX는 어떤 값인가 하고 위를 보니

EAX = EAX – EDX 인데 위에서 EDX에는 [EBP-7C]를 담고 EAX에는 [EBP-78]을 담고 있으므로, 정리하면 EAX = [EBP-78] – [EBP-7C] 된다.

 

여기서 잠깐 EBP-69의 조건을 생각해보자.

EBP-69가 0이 된다면 앞에서 차례대로 거슬러 온 값들이 0이 되고 결국 해당 함수의 리턴값도 0, 즉, 성공문으로 가는 조건인 [EBP-A5]가 0이 되면 안된다는 조건이 성립하지 않는다.

 

다시 말해서 위의 그림에서 [EBP-60]에 0이 담기면 안되므로 JLE에서 점프를 취해야 하고 그럼 EAX =< 5 라는 조건을 만족시켜야 한다.

 

이제 거의 다 왔다!

[EBP-78]과 [EBP-7C]만 확인하면 될 것 같다.

그림 12

위의 그림은 EBP-78 부분인데 위의 401406 이라는 함수의 리턴 값이 EBP-78에 담기고 있다.

일단 오른쪽의 EAX 레지스터를 보면 알 수 없는 값들이 함수의 첫번째 인자로 들어가고 있음을 알 수 있고

 

그림 13

함수의 실행이 끝나고 EAX에 0X30(48)이라는 값이 담기는 것을 알 수 있다.

그럼 두번째 인자가 무엇인지 알아야 하는데 이걸 찾는데 좀 헤맸다,,,

여기서 잘 모르겠어서 찾아봤는데 두번째 인자가 있는건 어떻게 아는거지,,,? 랑 디버거에서 두번째 인자를 어떻게 찾는거지,,,? 에서 막혔다.


일단 내가 찾은 방법을 가지고 오자면

그림 14

오른쪽의 숫자 1에서 ESP+4에 해당하는 값을 2에서 찾는다.

그리고 그 2에 해당하는 3에서 마우스 오른쪽을 누르면 아래에 “덤프에서 DWORD로 따라가기”가 있다. 거기서 원하는 덤프를 선택하면 바로 덤프창에 나오는데,

여기에서는 W가 들어있다. W는 내가 입력한 serial의 첫번째 글자이다!

 

이걸 조금 정리하자면 위의 401406 함수의 리턴 값인 0X30(48)의 위치에 W가 위치하는데,

그 알 수 없는 문자에서 확인해보면 진짜 그렇다.


요고,,,

AJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLN



자 그럼 이어서 EBP-7C도 동일하게 찾아보면 아래와 같고, 레지스터가 잘렸는데 0X43(67)이라는 값이 들어있고 두번째 인자에는 1이 들어있다. (내가 입력한 NAME의 첫글자)

그림 15

그리고 똑같이 알 수 없는 문자열에서 67번째 글자를 찾아보면 1이 맞다!

 

여기까지 해서 그 의미를 내가 이해한 방식대로 정리해본 결과,

EBP-78은 내가 입력한 serial의 첫번째 글자의 위치

EBP-7C는 내가 입력한 name의 첫번째 글자의 위치

인 것 같다.

 

그럼 위에서 본 내용을 살짝 상기시켜보면

1)    EAX는 [EBP-78] – [EBP-7C] 였고 EAX는 5 이하여야 한다.

즉, serial과 name의 각 글자의 위치의 차이가 5 이하여야 한다.

 

그리고 생각해보면 주어진 serial은 www ccc jjj rrr 처럼 각 4가지 알파벳의 같은 값이 세번 씩 반복되고 있고, name은 4글자이다.

또한 주어진 이상한 값을 보면, 첫째줄과 네번째 줄을 합치면 “I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU” 이라는 값이 3번 반복되고, 모든 알파벳은 한 문장안에 한번 씩 밖에 없으므로 w, c, j, r 모두 3번씩 나오게 된다.

다시 말하자면 name의 각 한글자들이 www, ccc, jjj, rrr 들을 만드는 것이라고 이해했는데,,, 이게 맞나,,??


AJXGRFV6BKOW3Y9TM4S2ZU

I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU

I70H5Q81PDECLN


그럼 이제 진짜 다 했다.


주어진 문자열에서 serial의 각 알파벳을 찾아서 앞뒤 다섯 글자 내로 문제에서 주어진 대로 숫자-소문자-대문자 순서로 했을 때 가장 먼저오는 값들을 가져오면 serial에 해당하는 name 값일 것이다.

그림 16

W의 양쪽을 보면 V 6 B K O 3 Y 9 T M 이 오고  그 중에서 조건에 맞는 문자는 3이다.

 

 

그림 17

C는 8 1 P D E L N A J X 이고, 조건에 맞는 문자는 1.

 

그림 18


J는 E C L N A X G R F V 이고

숫자랑 소문자가 없으니까 A가 될 것이다.

 

그림 19

마지막으로 R은 N A J X G F V 6 B K 이고

6이 될 것이다.

 

다 합치면 WWWCCCJJJRRR에 해당하는 NAME 값은 31A6 이다!

 

문제에 입력해보면 올바르게 찾은 것을 알 수 있다 😊

그림 20

 

'Reversing > CodeEngn' 카테고리의 다른 글

[CodeEngn] Advance RCE L09풀이  (0) 2021.11.13
[CodeEngn] Advance RCE L08풀이  (2) 2021.11.13
[CodeEngn] Advance RCE L07풀이  (0) 2021.11.13
[CodeEngn] Advance RCE L06풀이  (0) 2021.11.13
[CodeEngn] Advance RCE L05풀이  (0) 2021.11.13