-->

[CodeEngn] Basic RCE L17 풀이

CodeEngn Basic RCE L17 문제 확인

앞선 문제들이 Name이 주어졌을 때 시리얼이나 키값을 구하는 문제들이었다면 17번 문제는 Key값이 주어지고 이때의 Name 값이 무엇인지 묻고있다. 이번 문제는 Name이 한자리인 것에서도 삽질을 좀 하고 4바이트를 넘어가는 연산이라는 것을 생각하지 못해서도 삽질을 하고... 삽질을 좀 많이 했다.

 

 

 

파일을 실행시켜 보니 아래와 같이 Name과 Key 값을 입력받고 있다.

 

 

 

CodeEngn Basic RCE L17 풀이

문자열에서 Key를 체크하는 함수에서 사용될 것 같은 'Good Boy!!!'와 'Well done!'을 발견하고 사용되는 함수로 가보았다.

 

 

 

해당 문자열이 쓰인 부분 위의 베이직 블락을 보니 LstrCmp 함수 호출로 두 문자열을 비교하고 있고 비교 대상은 edx와 eax이다. 어떤 것이 어떤 값인지 확인해보기 위해 LStrCmp에 bp를 걸고 실행시킨 후 Name에 AAAA와 Key에 문제에서 주어진 Key값을 입력해보았다.

 

 

 

확인해보니, 아래와 같이 eax는 입력한 키값, ss:[ebp-18]은 입력한 Name값인 것이 확인되었다.

 

 

 

그리고 아래와 같이 ss:[ebp-14] 값은 정답 키 값인 것이 확인되었다.

 

 

 

Name을 이용해 Key값이 생성될 것이므로 Key값이 쓰이는 부분을 먼저 찾으려고 정답 Key 값이 저장된 주소에 하드웨어 bp를 걸었는데 스택 주소가 ASLR로 인해 계속 변경되기 때문에 이 방법으로는 찾을 수 없었다.

 

 

 

따라서 LStrCmp를 호출하는 함수 _TForm1_Button1Click가 그렇게 커보이지 않기에 처음부터 트레이싱해보기로 했다. 함수 이름이 저렇게 되어있는 것을 보니 Delphi 프로그램인가보다. 그런데 트레이싱하다보니 이상한 것이 있었는데 문제에서 Name이 한자리라고 했는데 3보다 큰지를 확인하고 작으면 더 입력하라고 나오는 것이다. 

 

 

 

여기서 뭐지 싶어 이상한 삽질을 많이 했는데 Name을 사용해 Key 값을 생성하는 알고리즘의 경우 한자리인 것과는 무관하게 Key 값 길이는 고정적으로 나왔다.

 

 

 

직접 트레이싱하면서도 확인할 수 있고 IDA로도 충분히 확인할 수 있는 것이 Name 값을 가져온 후부터 Key 값이 정답인지 비교할 때까지 Name이 쓰이는 부분은 sub_45B850 함수밖에 없다. 즉, 여기서 Name을 사용해 Key값을 생성한다는 것이다. 인자값으로도 eax가 들어가는 것을 볼 수 있다.

 

 

 

따라서 해당 함수를 트레이싱해보니, 아래의 반복문에서 Name을 한글자씩 쪼개 가져와 Name의 길이대로 반복문을 돌면서 특정 연산을 하는 것으로 Key값이 생성되는 것을 알 수 있었다.

 

 

 

처음엔 이 부분을 헥스레이로 보고 했으나 계속 뭔가 이상해서 보다보니 헥스레이의 hex값 일부(0x8E8)가 오해석 된 것을 발견했다. 가끔 이런경우가 있어서 어셈으로 많이 보려고 하는데 이번에...^^ 삽질을 해버렸다. 연산순서도 좀 헷갈려서 엄청 복잡하지도 않은데 그냥 어셈으로 보기로 했다.

 

 

 

사실.. 한글자이기 때문에 A부터 입력해보다가 F인 것을 알긴 했다(cmp로 Name 길이를 체크하는 부분을 우회한 뒤에). 그래도 공부하는 입장이니 Key 생성 부분 알고리즘을 봐보자.

 

 

 

esi는 Name[0]으로 볼 수 있고 아래 어셈 부분을 그대로 C언어 코드로 입력해주었다. 아무래도 4바이트를 넘어가게 연산이 되다보니 파이썬보다는 오버플로 제한을 할 수 있게끔 변수를 int로 정의할 수 있는 C언어가 더 편할 것 같았다.

 

 

 

 

처음에 esi에 Name[0]을 넣은 후 0x772를 곱하는 것에서부터 시작한다. 아래와 같이 Name[0]을 0x46(F)로 시작한 후 마지막 연산 값을 출력해보면 0xBEDA임을 확인할 수 있다.

 

 

'리버싱 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L19 풀이  (0) 2020.03.05
[CodeEngn] Basic RCE L18 풀이  (0) 2020.03.05
[CodeEngn] Basic RCE L16 풀이  (0) 2020.03.01
[CodeEngn] Basic RCE L15 풀이  (0) 2020.02.29
[CodeEngn] Basic RCE L14 풀이  (0) 2020.02.27

댓글

Designed by JB FACTORY