tmxklab

[CodeEngn] Basic RCE L20 본문

War Game/CodeEngn

[CodeEngn] Basic RCE L20

tmxk4221 2021. 2. 4. 18:23

1. 문제

 

1) 문제확인

아무것도 안뜬다. 위에 문제에서는 특정 문자열이 출력되기 위해 어떠한 데이터가 필요하다고 한다.

 


2. 접근방법

 

  • "Cracked by"문자열 참조하는 로직 찾기

  • sub_401362() 호출하는 로직 찾기

  • start()에서 eax값 1이면 우리가 원하는 메시지를 호출할 수 있다.
  • 이제, 디버깅을 통해서 저 곳까지 어떻게 도달해야 하는지 알아보자

 


3. 문제풀이

 

  • CreateFileA()을 통해 "CRACKME3.KEY"파일을 open하는 것 같다. 여기서는 파일이 존재하지 않아 리턴 값으로 -1을 뱉었다 퉤

  • CreateFileA()를 통해 "CRACKME3.KEY"파일을 open하여 0x12(18)byte만큼 데이터를 읽어 input_val변수에 저장한다.
  • 문제는 if문이 참이되어 sub_401346()을 호출해야 한다.
  • sub_401311(&input_val) : input_val의 첫 바이트부터 14byte만큼 xor을 수행하여 input값을 변조한다. 그리고 xor한 값의 합을 sum_xor에 저장한다.
    • input_val[0] = input_val[0] ^ 0x41 ~ input_val[13] = input_val[13] ^ 0x4F
    • sum_xor = 위의 xor한 값들을 모두 합하여 저장
  • sum_xor ^= 0x12345678
  • v2 = (sub_40133C(&input_val) == sum_xor) : sub_40133C(&input_val)의 리턴 값은 input_val[14]의 주소를 리턴 하는 것, 즉 sum_xor값과 input_val[14~17] 4byte를 비교함

말로 설명하는게 힘들어서 그림으로 그려놓음 위 그림을 참고하면서 조건에 맞도록 구성해보자

 

 

그리고 마지막으로 v2가 참인 경우 sub_401362()을 호출하게 되는데 위에서 봤듯이 v2는 sum_xor값과 sub_40133C(&input_val)가 동일해야 1로 세팅된다. 해당 함수를 호출하면 xor로 인해 변조된 input_val문자열을 메시지 박스에서 볼 수 있다.

 

0x402008부터 입력 값을 0x61 ~ 0x72주고 xor과정이 진행되면 위와 같이 변하여 0x20으로 채워지고 디버거에서 v2 = (sub_40133C(&input_val) == sum_xor) 이 부분이 참이 되도록 만들어 sub_401362()를 호출하게 되면 0x20(space)값이 출력되다가 느낌표가 출력된다. 느낌표는 mov word ptr ds:[edi], D21을 통해 0x0D, 0x21(!)가 추가되었기 때문에 우리는 따로 느낌표를 만들필요가 없으므로 "CodeEngn"까지만 만들어주도록 하면된다.

 

xor한 값에 xor을 한 번 더하면 원래 값이 나오므로 이 원리를 이용하여 코드를 짜보자

key = [ ord(a) for a in "CodeEngn\x00" ]

sum_xor = 0
var_0x41 = 0x41
new_list = []

for code in key:
    sum_xor = sum_xor + (var_0x41 ^ code)
    new_list.append(hex(var_0x41 ^ code))
    var_0x41 += 1

print(new_list)

 

이제 위 결과 값을 통해 파일 내용을 변경하고 실행해보자

sum_xor값은 0x1234557B이므로 input값의 마지막 4byte를 저걸로 변경하자

 

 

최종적으로 파일 내용은 아래와 같이 구성하고 실행하면

(참고로 위 사진의 빨간색 박스안에는 어떠한 값이 들어가도 상관없음)

메시지 박스에 "CodeEngn!"가 출력된다.

 

위 빨간색 박스에 어떠한 값이 와도 상관이 없으므로 답은 여러 개이다.

 

 


4. 몰랐던 개념

'War Game > CodeEngn' 카테고리의 다른 글

[CodeEngn] Advance RCE L03  (0) 2021.02.17
[CodeEngn] Advance RCE L01  (0) 2021.02.17
[CodeEngn] Basic RCE L19  (0) 2021.01.29
[CodeEngn] Basic RCE L18  (0) 2021.01.29
[CodeEngn] Basic RCE L17  (0) 2021.01.29
Comments