rev-basic-4 문제도 마찬가지로 문자열을 역참조해서
문자열을 암호화시키는 함수를 찾을 수 있다. 위 링크 참조하기 바람.
암호화시키는 함수만 들여다보면 아래와 같다.
FUN_140001000 ... MOVSXD RAX ,dword ptr [RSP ]=>local_18 MOV RCX ,qword ptr [RSP + local_res8 ] MOVZX EAX ,byte ptr [RCX + RAX *0x1 ] SAR EAX ,0x4 MOVSXD RCX ,dword ptr [RSP ]=>local_18 MOV RDX ,qword ptr [RSP + local_res8 ] MOVZX ECX ,byte ptr [RDX + RCX *0x1 ] SHL ECX ,0x4 AND ECX ,0xf0 OR EAX ,ECX MOVSXD RCX ,dword ptr [RSP ]=>local_18 LEA RDX ,[DAT_140003000 ] MOVZX ECX ,byte ptr [RDX + RCX *offset DAT_140003000 ] = 24h $ CMP EAX ,ECX ...
MOVSXD RAX ,dword ptr [RSP ]=>local_18 MOV RCX ,qword ptr [RSP + local_res8 ] MOVZX EAX ,byte ptr [RCX + RAX *0x1 ] SAR EAX ,0x4
받은 문자열 중 0번째 문자에 SAR 어셈블리 연산으로 인해 0x4만큼 오른쪽으로 시프트한다.
EAX = 0번째 문자 >> 0x4
MOVSXD RCX ,dword ptr [RSP ]=>local_18 MOV RDX ,qword ptr [RSP + local_res8 ] MOVZX ECX ,byte ptr [RDX + RCX *0x1 ] SHL ECX ,0x4
받은 문자열 중 0번째 문자에 SHL 어셈블리 연산으로 인해 0x4만큼 왼쪽으로 시프트한다.
ECX = 0번째 문자 << 0x4
AND ECX ,0xf0 OR EAX ,ECX MOVSXD RCX ,dword ptr [RSP ]=>local_18 LEA RDX ,[DAT_140003000 ] MOVZX ECX ,byte ptr [RDX + RCX *offset DAT_140003000 ] CMP EAX ,ECX
ECX = ECX & 0xF0
EAX = EAX | ECX 한다음,
EAX값이랑 암호화된 문자열 중 0번째 문자값이랑 비교한다.
암호화된 문자열(DAT_140003000)은 다음과 같다.
\x24\x27\x13\xC6\xC6\x13\x16\xE6\x47\xF5\x26\x96\x47\xF5\x46\x27\x13\x26\x26\xC6\x56\xF5\xC3\xC3\xF5\xE3\xE3
아래와 같이 한문자씩 계속 비교한다고 보면 된다.
0x24 != (0번째 문자 >> 4) | ((0번째 문자 << 4) & 0xf0) 0x27 != (1번째 문자 >> 4) | ((1번째 문자 << 4) & 0xf0) 0x13 != (2번째 문자 >> 4) | ((2번째 문자 << 4) & 0xf0) ...
ASCII 코드 범위는 0~127 이므로
그 범위안 숫자를 계속 대입하여 문제를 풀 수 있었다.
enc_str = b'\x24\x27\x13\xC6\xC6\x13\x16\xE6\x47\xF5\x26\x96\x47\xF5\x46\x27\x13\x26\x26\xC6\x56\xF5\xC3\xC3\xF5\xE3\xE3' dec_str = "" for i in range(len(enc_str)): for j in range(127): if((j>>4) | ((j << 4)&0xf0) == enc_str[i]): break dec_str = dec_str + chr(j) print(dec_str)
ubuntu@WSL:~/CTF/dreamhack.io/chall4$ python3 chall4.py Br1ll1ant_bit_dr1bble_<<_>>