콘텐츠로 건너뛰기

rev-basic-4

https://h4ck.kr/2023/06/19/rev-basic-3/: rev-basic-4

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_<<_>>
태그:

답글 남기기