728x90

풀이

main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.

__ROL1__(*(_BYTE *)(a1 + i), i & 7)는 읽은 바이트를 왼쪽으로 (i & 7) 비트만큼 회전하는 코드이다. 여기서 & 7 연산은 i 값을 8로 나눈 나머지를 구하는 것과 같으므로, 회전 수는 항상 0에서 7 사이가 된다. __ROL1__은 "Rotate Left" 연산을 의미한다. 해당 연산을 한 후 i와 xor한 값이 byte_140003000 값과 일치하면 조건에 맞는 값이다. 

byte_140003000을 얻어오자.

 

a = "52 DF B3 60 F1 8B 1C B5 57 D1 9F 38 4B 29 D9 26 7F C9 A3 E9 53 18 4F B8 6A CB 87 58 5B 39 1E"
a = a.split()
a = [int(x, 16) for x in a]

tmp = []
for i in range(31):
    k = a[i]^i
    r = i%8
    k = ((k >> r) | (k << (8 - r))) & 0xFF
    tmp.append(k)

for i in range(31):
    print(chr(tmp[i]),end='')

byte_140003000에 위치한 배열값과 i를 xor하고 그 값을 i%8 만큼 rotate right 연산을 해주면 원하는 값을 얻을 수 있다. 해당 연산을 파이썬 코드로 작성했다. 

파이썬 코드를 실행시켜보면 이와 같은 결과가 나온다. 

파일을 실행해 확인해보면 맞는 값인 것을 확인할 수 있다. 

'Write-up > Reversing' 카테고리의 다른 글

[Dreamhack] rev-basic-9  (1) 2024.05.18
[Dreamhack] rev-basic-8  (0) 2024.05.14
[Dreamhack] rev-basic-6  (0) 2024.05.14
[Dreamhack] rev-basic-5  (0) 2024.05.14
[Dreamhack] rev-basic-4  (0) 2024.05.13

+ Recent posts