어셈블리어 코드를 보면 rcx에 올라간 문자열과 사용자의 입력 값을 그대로 비교하는 것이 아니라
사용자의 입력 값을 연산하여 rcx의 값과 비교하기 때문에 연산과정을 역연산하여
FLAG를 도출해야 한다.
사용자의 입력 값이 연산되는 식은 다음과 같다.
- str : 메모리에 저장된 비교 문자열
- input : 사용자가 입력한 문자열
- i : 문자열 카운트를 위한 정수형 변수
연산식 : (input[i]^i)+(i*2)=str[i]
해당 연산을 통해 메모리에 저장된 문자열과 비교를 하기 때문에
사용자가 입력해야할 값을 추측하기 위해서는 input[i]의 값을 역연산 해야 한다.
1. (input[i]^i)+(i*2)=str[i] // 기본 연산식
2. (input[i]^i)=str[i]-(i*2) // 양변에 -(i*2) 추가
3. input[i]=(str[i]-(i*2))^i // 양변에 ^i 추가 => 역연산 식
해당 연산을 비교 문자열 길이인 i=24로 놓고 파이썬으로 코드를 작성해보자.
str='49','60','67','74','63','67','42','66','80','78','69','69','7B','99','6D','88','68','94','9F','8D','4D','A5','9D','45'
res=''
for i in range(24):
res+=chr((int(str[i],16)-(i*2))^i)
print(res)