왜 항상 나만 오래 걸리는 거 같지 하
일단 디컴파일을 해줘서 "Correct"에 도달하기 위한 참 조건에 주소를 한번 들어가 보자
0x18 보다 클 때까지 반복을 하고 byte_7 FF6A6D83000에 배열 안에 있는 것들을 '!='을 이용 계산식을 비교한다.
unsigned __int 8 같은 경우 자료형이라 연산에서는 제외시켰다.
참고로 같지 않을 경우 참이 돼버리니 오른쪽에 속한 연산 이랑 결과 값이 계속 같아야 한다.
일단은 byte_7 FF6 A6 D83000에 뭐가 들어있는지 주소를 찾아가 보자.
배열에는 총 24byte에 데이터가 존재했다.
오른쪽 연산식에 과 항상 같아야 하니 연산식을 역연산으로 바꿔야 한다.
현재 식에서 모르는 값은 'a1'이다.
byte에 배열들을 알아냈으니 역연산을 통해 a1을 알아내도록 하자.
bytes[i] != (i ^ (a1+i)) + (2 * i)
현재 식은 이렇게 되어있다.
하지만 '!=' 보다는 항상 같아야 하기 때문에 연산식으로는 "="를 사용해 바꾸도록 하겠다.
그렇다면
bytes[i] = (i ^ (a1+i)) + (2 * i)
'!=' 부분을 '='로 바꿨다
이 부분은 역연산이 아니다
차근차근해보자
bytes[i] - (2 * i) = i ^ (a1 + i)
' - (2 * i ) '을 적용시키면 오른쪽에 있는 식은 없어지게 된다.
계속해보자
(bytes[i] - (2 * i)) ^ i = a1 + i
다음은 '^ i' XOR 연산자를 가져왔다.
나머지 이제 i 도 똑같이 옮겨주자
a1 = ((bytes[i] - (2 * i)) ^ i) - i
가독성이 좋게 'a1'을 왼쪽으로 배치했다
이렇게 식을 다 완성했으니 계산만 한다면 식을 유추할 수 있다.
'DreamHack > Reverising' 카테고리의 다른 글
rev-basic-4 (1) | 2024.10.09 |
---|---|
patch (1) | 2024.10.08 |
rev-basic-2 (1) | 2024.09.26 |
rev-basic-1 (0) | 2024.09.11 |
rev-basic-0 (1) | 2024.09.11 |