CTF/Dreamhack.io
[Reversing] rev-basic-7
현생준비중
2022. 1. 26. 14:54
역시 IDA.. 근데 처음보는 함수가 보인다. 느낌상 ROL? 왼쪽으로 돌릴거 같은데..
// https://github.com/joxeankoret/tahh/blob/master/comodo/defs.h
// rotate left
template<class T> T __ROL__(T value, int count)
{
const uint nbits = sizeof(T) * 8;
if ( count > 0 )
{
count %= nbits;
T high = value >> (nbits - count);
if ( T(-1) < 0 ) // signed value
high &= ~((T(-1) << count));
value <<= count;
value |= high;
}
else
{
count = -count % nbits;
T low = value << (nbits - count);
value >>= count;
value |= low;
}
return value;
}
inline uint8 __ROL1__(uint8 value, int count) { return __ROL__((uint8)value, count); }
대충 맞는거 같다. 코드를 해석하면 i ^ ROL1(a1[i], i & 7) == FLAG[i] 라는건데..
ROR1((FLAG[i] ^ i), i & 7)로 하면 원래 값이 나오지 않을까?
def __ROL__(num, count, bits=8):
return ((num << count) | (num >> (bits - count))) & ((0b1<<bits) - 1)
def __ROR__(num, count, bits=8):
return ((num >> count) | (num << (bits - count))) & ((0b1<<bits) - 1)
검색해보니 파이썬으로 짜여진 ROL, ROR 함수가 있어서 바로 가져왔다.
var1 = [0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9, 0x26, 0x7F, 0xC9,
0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E, 0x00]
def __ROL__(num, count, bits=8):
return ((num << count) | (num >> (bits - count))) & ((0b1<<bits) - 1)
def __ROR__(num, count, bits=8):
return ((num >> count) | (num << (bits - count))) & ((0b1<<bits) - 1)
for i in range(len(var1)):
a = __ROR__(i ^ var1[i], i & 7)
print(chr(a), end='')