Synack Red Team Five CTF 작성 - Rev

4446 단어 ctfwriteup
저는 Synack Red Team Five CTF에 참가했습니다. 저는 25개의 도전 과제를 모두 해결했고 333개 팀 중 13위를 차지했습니다.

Hilb3r7/synack-red-team-five-ctf에서 챌린지 설명과 다운로드 가능한 파일을 얻을 수 있습니다.

반전



사용 도구: 기드라

입장



이를 디컴파일하고 "액세스 허가됨! 플래그 형식으로 핀 제출"을 찾습니다. main 함수에서.
핀은 (&DAT_00102014)[i] ^ 0x20 함수에서 각 문자를 checkpin와 비교합니다.DAT_00102014\x4c\x13\x54\x7f\x4d\x45\x7f\x11\x4e\x7f\x4c\x13\x54\x7f\x4d\x45\x45\x45\x45\x7f\x49\x4e\x01\x01\x00입니다.
각 문자를 0x20과 XOR하면 l3t_me_1n_l3t_meeee_in!!가 됩니다.
플래그 형식으로 만들고 HTB{l3t_me_1n_l3t_meeee_in!!}가 플래그입니다.

확인하다



그것을 디컴파일하고 main 함수에서 많은 지역 변수 할당을 찾으십시오.
스택 문자열 기법이라고 합니다.local_58 변수를 선택하고 마우스 오른쪽 버튼을 클릭한 다음 Retype variable를 선택하고 char[32]를 입력합니다.
이제 비밀을 볼 수 있습니다. ch3ck_anD_r3checK_aga1n! .
printf 형식Welcome Agent, heres\'s a small gift: HTB{%s}\n에 따르면,
플래그는 HTB{ch3ck_anD_r3checK_aga1n!} 입니다.

나뉘다



디컴파일하고 일부 정보를 수정합니다.
  • local_88 = "v!7Xf-;.2=1/";
  • decrypt, sub1, sub2, sub3 함수
  • DAT_00102008 값

  • 다음 함수를 읽고 Python으로 해당 기능을 구현합니다.

    buffer = []
    
    out_buf = ""
    
    for i in range(256):
      buffer.append(i)
    
    local_18 = 0
    
    ctx = "v!7Xf-;.2=1/"
    out = [
      0x9f,
      0x69,
      0x43,
      0x1b,
      0x90,
      0x12,
      0x96,
      0x7a,
      0x23,
      0x76,
      0x8f,
      0x2e,
      0x9e,
      0x9f,
      0xeb,
      0x23,
      0x40,
      0xed,
      0xbd,
      0x7a,
      0x4b,
      0x99,
      0xf6,
      0xa0,
      0x0c,
      0x00,
    ]
    ctx_len = len(ctx)
    
    for i in range(256):
      iVar1 = ord(ctx[i % ctx_len]) + buffer[i] + local_18
      uVar2 = (iVar1 >> 0x1f) >> 0x18
      local_18 =(iVar1 + uVar2 & 0xff) - uVar2
    
      tmp = buffer[i]
      buffer[i] = buffer[local_18]
      buffer[local_18] = tmp
    
    print(buffer)
    
    out_len = len(out)
    
    local_24 = 0
    local_20 = 0
    
    for i in range(out_len):
      local_24 = (local_24 + 1) & 0xff
      local_20 = (local_20 + buffer[local_24]) & 0xff
      tmp = buffer[local_20]
      buffer[local_20] = buffer[local_24]
      buffer[local_24] = tmp
      out_buf += (chr(out[i] ^ buffer[(buffer[local_20] + buffer[local_24]) & 0xff]))
    
    print(out_buf)
    


    실행하고 HTB{d0_th1s_oR_do_th47!?} 플래그를 가져옵니다.

    똑 똑



    파이인스톨러 바이너리입니다.
    https://github.com/extremecoders-re/pyinstxtractor을 사용하여 바이너리에서 소스 코드 아카이브를 추출합니다.
    (그냥 python pyinstxtractor.py ./backdoor을 실행하거나),
    이제 많은 .pyc 파일이 추출됩니다.
    Findsrc.pyc는 Python3.9로 형식이 잘못되어 있으므로https://github.com/rocky/python-uncompyle6/는 디컴파일을 거부합니다.
    그런데 챌린지 정보에는 Python3.8이라고 나와 있어서 helloworld python 스크립트를 작성하고 Python3.8로 실행합니다.
    Python3.8 .pyc 파일을 생성합니다. 그것을 분석하고 서명이\x55임을 찾으십시오.src.pyc의 서명을\x61에서\x55로 변경하고 uncompyle6 backdoor-src.38.pyc > backdoor-src.py를 실행하여 디컴파일합니다.

    backdoor-src.py는 다음과 같습니다.

    import socket
    from hashlib import md5
    from subprocess import check_output
    sock = socket.socket()
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('0.0.0.0', 4433))
    sock.listen(5)
    while True:
        client, addr = sock.accept()
        data = client.recv(32)
        if len(data) != 32:
            client.close()
        else:
            if data.decode() != md5(b't0p_s3kr3t').hexdigest():
                client.send(b'Invalid')
            size = client.recv(1)
            command = client.recv(int.from_bytes(size, 'little'))
            if not command.startswith(b'command:'):
                client.close()
            else:
                command = command.replace(b'command:', b'')
                output = check_output(command, shell=True)
                client.send(output)
                client.close()
    


    그냥 읽고 비밀을 찾으면 't0p_s3kr3t', '8f4328c40b1aa9409012c7406129f04b'의 md5sum입니다.
    전송 후 'command:' 다음의 모든 명령이 실행됩니다.

    (스크린샷을 저장하려고 노력했지만 저장하지 않았습니다...
    그래서 기본적으로 내가 실행한 플래그와 명령을 잃어버렸습니다...)

    좋은 웹페이지 즐겨찾기