바로 비교함수를 확인해보자

코드 자체는 그냥 연산을 따라가면 확인할 수 있을 것 같은데 처음보는 어셈블리 명령어가 보인다.
00007FF644D41044 | D2C0 | rol al,cl |
여기서 rol이라는 명령어를 알아보기 전에 al과 cl에 대해서 먼저 알아보자면 어셈블리어에서는 범용 레지스터가 있다. 32비트로 EA,B,C,DX, 그리고 64비트 RA,B,C,DX인데 값을 잠깐 저장하는데 쓰인다. 각레지스터마다주된사용처가있지만신경쓸필요X
이 범용 레지스터에서 하위 비트를 부르는 명칭이 있다. 예를 들어 AX는 RAXEAX의 하위 4바이트16비트이다. 아래의 그림을 참고하자.

그러면 이제 [ROL AL, CL]이라는 명령어의 의미는 "RAX의 하위 8비트를 RCX의 하위 8비트만큼 ROL해서 AL에 저장해라."라는 의미이다.
이번에는 ROL명령어에 대해서 알아보자. 이 부분에 대해서는 아래의 링크를 통해 공부하였다.
https://m.blog.naver.com/sol9501/70091168321
|정수 연산 ①| 시프트와 회전 명령어 및 응용
|정수 연산 1| 시프트와 회전 명령어 및 응용 목표 : 시프트 연산의 기본적이 사용법과 응용 및 각 연산이 ...
blog.naver.com
ROL명령어는 간단히 말해서 왼쪽으로 비트회전이다. 코딩을 조금이라도 해 본 사람이라면 비트시프트에 대해서 알고 있을 것이다. 기본적으로 왼쪽으로 비트시프트를 하면 보통 최상위 비트는 그대로 사라진다. 그러나 비트회전은 최상위 비트를 CARRY 플래그와 최하위 비트로 복사한다. 비트가 말 그대로 회전한다는 것이다.
최종적으로 [ROL AL, CL]의 의미는 "RAX의 하위 8비트를 RCX의 하위 8비트만큼 왼쪽으로 비트회전해서 AL에 저장해라."라는 뜻이다.
따라서 비교함수식은
rol(input[i], i & 7) ^ i == enc[i]
이를 통해 역산식을 구하면
input[i] = rorenc[i] ^ i, i & 7이 된다.
ROR코드 및 ROL코드는 아래 링크에서 복사해왔다.
https://hacking-ai.tistory.com/68
어셈블리 ROL, ROR 코드 구현
리버싱 문제를 풀다가 ROL, ROR이 나왔는데, 기드라의 경우 디컴파일 결과가 단지 >>와 같이 쉬프트 연산만 수행하는 방식으로 나오는 문제를 겪었다. 따라서, 이를 해결하기 위해 파이썬으로 ROL, R
hacking-ai.tistory.com
def rol(x, n): shiftBit = x << n shiftBit &= 255 carryBit = x >> 8 - n return shiftBit | carryBit def ror(x, n): shiftBit = x >> n carryBit = x << (8 - n) carryBit &= 255 return shiftBit | carryBit enc = '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 00' enc = tuple(enc.split(' ')) res = '' for i in range(31): res += chr(ror((int(enc[i], 16) ^ i), (i&7))) print(res)


새로운 명령어로 지식이 늘었다.
'Security > Reversing' 카테고리의 다른 글
Dreamhack rev-basic-9 0 | 2022.07.05 |
---|---|
Dreamhack rev-basic-8 0 | 2022.07.05 |
Dreamhack rev-basic-6 0 | 2022.06.01 |
Dreamhack rev-basic-5 0 | 2022.05.28 |
Dreamhack rev-basic-4 0 | 2022.05.25 |