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

    rev-basic-7 문제도 마찬가지로 문자열을 역참조해서
    문자열을 암호화시키는 함수를 찾을 수 있다. 위 게시물 참조하기 바람.

    암호화시키는 함수만 들여다보면 아래와 같다.

    sub_140001000      
    ...
       movsxd  rax, [rsp+18h+var_18]
       mov     rcx, [rsp+18h+arg_0]
       movzx   eax, byte ptr [rcx+rax]
       imul    eax, 0FBh
       and     eax, 0FFh
       movsxd  rcx, [rsp+18h+var_18]
       lea     rdx, byte_140003000
       movzx   ecx, byte ptr [rdx+rcx]
       cmp     eax, ecx
    ...

    movsxd  rax, [rsp+18h+var_18]
    mov     rcx, [rsp+18h+arg_0]
    movzx   eax, byte ptr [rcx+rax]

    초기로 가정했을때 반복문에서의 카운트 변수값인 0을 인덱스로 지정하여
    EAX에는 입력받은 0번째 문자값이 들어간다.


    imul    eax, 0FBh
    and     eax, 0FFh

    eax 값을 0xFB와 곱하고, 곱한 값을 0xFF와 and 연산한 값을 eax에 다시 저장한다.
    eax = (eax * 0xFB) & 0xFF


    movsxd  rcx, [rsp+18h+var_18]
    lea     rdx, byte_140003000
    movzx   ecx, byte ptr [rdx+rcx]
    cmp     eax, ecx

    그리고 EAX 값과 ECX값인 ‘암호화된 문자열[0]’과 서로 비교한다.


    암호화된 문자열은(byte_140003000)은 아래와 같았다.

    \xAC\xF3\x0C\x25\xA3\x10\xB7\x25\x16\xC6\xB7\xBC\x07\x25\x02\xD5\xC6\x11\x07\xC5\x00

    아래와 같이 한문자씩 계속 비교한다고 볼 수 있다.

    암호화된 문자열[n] != (입력받은 문자열[n] * 0xFB) & 0xFF
    
    0xAC != (입력받은 0번째 문자값 * 0xFB) & 0xFF
    0xF3 != (입력받은 1번째 문자값 * 0xFB) & 0xFF
    0x0C != (입력받은 2번째 문자값 * 0xFB) & 0xFF
    ...

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

    결론적으로 reb-basic-4 풀이와 비슷하게 계속 대입하는 방식으로 비슷하게 풀 수 있었다.

    0~127 아스키 숫자 범위 안으로 무작위 대입해서 값을 구하였다.

    enc_str = b'\xAC\xF3\x0C\x25\xA3\x10\xB7\x25\x16\xC6\xB7\xBC\x07\x25\x02\xD5\xC6\x11\x07\xC5\x00'
    dec_str = ""
    
    for i in range(len(enc_str)):
        for j in range(127):
            if enc_str[i] == (j * 0xfb) & 0xff:
                dec_str = dec_str + chr(j)
    
    print(dec_str)
    ubuntu@WSL:~/CTF/dreamhack.io/chall8$ python3 chall8.py
    Did_y0u_brute_force?

    답글 남기기

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