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_<<_>>

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다