tmxklab
[CodeEngn] Basic RCE L20 본문
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 |