또 뭐하지
[Dreamhack] rev-basic-7 본문
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 |