728x90
파일 실행
실행을 해봅쉬다
문자열을 찾으면 메인함수를 쉽게 찾을 수 있을 것 같습니다!!
그럼 정적분석을 먼저 해봅시다~
정적분석
8행의 sub_140001000 함수가 문자열을 검증하는 함수인가 봅니다.
이 함수 이름을 "check_input" 이라고 바꾸겠습니다
check_input의 함수를 한번 살펴봅시다
반복문에서 i가 18(hex, dec=24)까지 증가하며 byte_140003000 배열의 각 값이 i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i 의 계산 결과와 같아야지만 Correct를 출력하는 것 같습니다. (이때 a1은 우리가 입력한 문자열)
여기서 알아야 할 것은 저 중간의 XOR(^) 연산인데, XOR 연산의 가장 대표적인 특징이 다음과 같습니다.
if A ^ B = C ,
then C ^ B = A
저 식을 참고해보면
byte_14003000[i] != (i ^ (a1+i) + 2*i) 이라는 식은 다음과 같이 변형 가능합니다.
(byte_14003000[i] - 2*i) XOR i != (a1+i)
그러면 byte_14003000 에는 도대체 무엇이 들어있을까?
더블 클릭을 해보면 이런 데이터가 나옵니다.
그럼 이 값을 이용해서 역 계산을 해봅시다! ^^
역계산을 하는 파이썬 코드는 다음과 같습니다.
byte_array = [0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78,
0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88, 0x68, 0x94, 0x9F, 0x8D, 0x4D, 0xA5, 0x9D, 0x45, 0x00]
result = ""
for i in range(24):
char = chr((byte_array[i] - (2 * i)) ^ i)
result += char
print(result)
그럼 결과는 다음과 같이 나옵니다!
이 문구를 그럼 다시 실행파일에 넣어봅시다
답
굳 ^_^
728x90
'WARGAME > reversing' 카테고리의 다른 글
[코드엔진/CodeEngn] Basic RCE L13 (0) | 2023.11.13 |
---|---|
[코드엔진/CodeEngn] Basic RCE L19 (1) | 2023.11.13 |
[dreamhack] patch (0) | 2023.09.22 |
[dreamhack] rev-basic-1 (0) | 2023.09.15 |
[dreamhack] rev-basic-0 (0) | 2023.09.15 |