rev-basic-5
파일을 받아 IDA로 보자.
'Corrcet' 출력을 위해 sub_14001000를 살펴보자.
수식과 byte_140003000 배열값들을 비교하여 답을 추출하는 문제이다.
식을 정리해보자.
if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i)!= byte_140003000 [i] )
형변환생략
(a1+i+1)+(a1+i) == byte_140003000[i]
(a [i]+1)+(a1[i]) = byte_140003000 [i]
byte_140003000 [i]에 대한 배열값들을 보자.
예시
(a1[0]+1) + (a1[0]) = byte_140003000[0] = 0xAD
(a1[1])+(a1[0])= byte_140003000[0] = 0xAD
(a1[2])+(a1[1] = byte_140003000[1] = 0xD8
(a1[3])+(a1[2]) = byte_140003000[2] = 0xCB
(a1[4]) + (a1[3]) = byte_140003000[3] = 0x9D
...
a1[17] + a1[16] = byte_140003000[16] = 0x4C
a1[18] + a1[17] = byte_140003000[17] = 0x00
마지막은 0x00 즉 0이라는 걸 파악할 수 있다.
그렇다면
a1[18] , a1[17] 값은 0이라는 소리가 된다.
부호가 없는 hex 값은 음수가 존재하지 않기 때문이다. (Unsigned)
그렇다면 a1 배열 값들은 몰라도 끝에 a1 [18], a1 [17]의 값이 0이라는 걸 알 수 있다.
역순으로 수식을 적용하여 다시 순서대로 print 하면 되는 문제인 거 같다.
for i in reversed(range(len(byte_140003000))):
a1[i] = byte_140003000[i] - a1[i+1]
수식은 그대로 사용하도록 하자 python 에는 reversed를 이용해서 리스트 요소를 뒤집어준다.
코드를 완성하여 확인하면...