본문 바로가기

HACKING

rev-basic-7 ROL 알고리즘

 

 

__int64 __fastcall sub_140001000(__int64 a1)
{
  int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; (unsigned __int64)i < 0x1F; ++i )
  {
    if ( (i ^ (unsigned __int8)__ROL1__(*(_BYTE *)(a1 + i), i & 7)) != byte_140003000[i] )
      return 0;
  }
  return 1;
}

 

프로그램의 IDA로 실행한 결과

 

__ROL1__ 알고리즘을 통해서 알 수 있음

 

 

ROL 1 즉 1바이트의 값이므로 0~7까지의 값을 가진다 따라서ㅡ  i&7을 통해서 자릿수를 맞춰준 모습

 

i&7 == i%8 이랑 동치이다.

 

 

i^ ~~ 을 통해서 XOR 연산을 진행하는 것을 알수 있다.

 

ROL 함수로 나온 값을 i와 XOR 연산을 한다

 

A^B^A를 하면 B의 값을 구할 수 있으므로

 

원본값으로 복원하기 위해서 

 

후처리된 값을 XOR 하고 ROR을 하게 되면 원본값을 획득할 수 있다/

 

 


byte = [82, 223, 179, 96, 241, 139, 28, 181, 87, 209, 159, 56,                                    
75, 41, 217, 38, 127, 201, 163, 233, 83, 24, 79, 184,
106, 203, 135, 88, 91, 57, 30, 0]

xor = []
answer = []

def ROR(x, r):
    r &= 7

    if r == 0:
        return x

    return ((x >> r) | (x << (8 - r))) & 0xFF


for i in range(len(byte)):
    xor.append(byte[i] ^ i)
   
for i in range(len(xor)):
    answer.append(ROR(xor[i], i%8))
   
for i in range(len(answer)):
    print(chr(answer[i]), end="")
   
   


 

ROR 함수 구현 

 

1. 0xff -> 

0xff  = 1111111 로 구성됨

8비트 값으로 유지하기 위해서 나머지 셈처리