DreamHack/Reverising

rev-basic-5

G_OM 2024. 10. 17. 14:26

 

 

파일을 받아 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를 이용해서 리스트 요소를 뒤집어준다.

 

코드를 완성하여 확인하면...