ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Clear] X-MAS CTF 2020 FORMULA TRANSLATION NOVICE Writeup
    CTF/X-MAS CTF 2020 2020. 12. 20. 22:41

    이번 대회에서 그나마 밥값(?)을 한 문제였을까.. 이 문제의 분류는 리버스 엔지니어링이었다. 문제 내용은,

     

    주어진 문제 파일을 열어보면 아래와 같다.

          REAL FUNCTION ANALYZER(M, I, B)
            INTEGER M(*), I
            INTEGER B, OP
    
            OP = I
            DO 10 I = 1, B
              B = B + 1
    10      CONTINUE
            I = OP
    
            OP = XOR(B, 35)
            IF (OP .EQ. M(I)) THEN
              ANALYZER = 1.0
            ELSE
              ANALYZER = 0.0
            ENDIF
    
            RETURN
          END
    
          SUBROUTINE COMPUTE(A, I, B)
            INTEGER A, I, B
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
    
            DO 50 I = 0, B -1
              B = B + 1
    50      CONTINUE
            I = I - 48
    
            IF (A .EQ. B) THEN
              OPTIMIZE = 1
            ELSE
              OPTIMIZE = 0
            ENDIF 
    
            RETURN
          END
    
          BLOCK DATA
            INTEGER PROGRESSIONMATRIX(12), CONVOLUTIONMATRIX(4,3)
            COMMON /PERFORMANTBLOCK/ CONVOLUTIONMATRIX, PROGRESSIONMATRIX
            INTEGER POSITIONMATRIX(2,2,5)
            COMMON /SLOWBLOCK/ POSITIONMATRIX
            DATA CONVOLUTIONMATRIX/7, 13, 15, 17, 19, 24, 30, 31, 34, 37
         +  , 39, 41/
            DATA PROGRESSIONMATRIX/241, 209, 201, 243, 207, 249, 231, 251
         +  , 235, 255, 209, 201/
            DATA POSITIONMATRIX/134, 36, 175, 63, 112, 163, 111, 37, 140, 73
         +  , 172, 83, 61, 65, 135, 53, 146, 43, 157, 58/
          END
    
          PROGRAM CHRISTMAS
            LOGICAL DECISION
            INTEGER INSTRUCTION
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
            CHARACTER I(42)
            INTEGER TT(-4:0), TT2(-4:0)
            INTEGER ANTIMONY(0:4)
            INTEGER PROGRESSIONMATRIX(12), CONVOLUTIONMATRIX(4,3)
            COMMON /PERFORMANTBLOCK/ PROGRESSIONMATRIX, CONVOLUTIONMATRIX
            INTEGER POSITIONMATRIX(2,2,5)
            INTEGER A, B
            PARAMETER(AX=28, AY=48)
    
            WRITE(*,*) "PLEASE INPUT FLAG."
            DECISION = .TRUE.
            READ(*,*) I
            DATA TT/85, 32, 64, 76, 94/
            DATA ANTIMONY/0, 4, 5, 8, 12/
            DATA POSITIONMATRIX/118, 53, 43, 51, 117, 51, 41, 53, 116, 51,
         +  40, 48, 113, 48, 38, 51, 109, 52, 36, 55/
    
            DO 20 J = 1, 5
              IF (XOR(ICHAR(I(J)), 13) .NE. TT(J - 5)) DECISION = .FALSE.
    20      CONTINUE
    
            IF (I(6) .NE. CHAR(123)) DECISION = .FALSE.
            IF (I(42) .LT. CHAR(125)) DECISION = .FALSE.
    
            DATA TT2/8, 12, 16, 21, 26/
    
            DO 30 J = 0, -4, -1
              IF (ICHAR(I(TT2(J))) .NE. 95) DECISION = .FALSE.
    30      CONTINUE
          
            DO 40 J = 1, 12, 1
              INSTRUCTION = ICHAR(I(PROGRESSIONMATRIX(J)))
              OPTIMIZE = J
              IF(ANALYZER(CONVOLUTIONMATRIX, OPTIMIZE, INSTRUCTION) 
         +    .LT. 0.5) DECISION = .FALSE.
    40      CONTINUE
    
            IF (ICHAR(I(29)) .NE. 95) DECISION = .FALSE.
            IF (ICHAR(I(35)) .NE. 95) DECISION = .FALSE.
            IF (ICHAR(I(38)) .NE. 95) DECISION = .FALSE.
    
            INSTRUCTION = 5570010
            TT(0) = 0
            DO 60 J = 0, 7
              CALL COMPUTE(LSHIFT(ICHAR(I(INT(AX + ANTIMONY(4-TT(0))))), 1)
         #,J,              INT(AY + MOD(INSTRUCTION, 10)))
    
              INSTRUCTION = INSTRUCTION / 10
              TT = TT + 1
              IF (OPTIMIZE .NE. 1) GOTO 1000
    60      CONTINUE
            
            DO 70 J = 1, 5
              IF (ICHAR(I(XOR(POSITIONMATRIX(1,1,J), 127))) .NE.
         +      POSITIONMATRIX(2,1,J)) DECISION = .FALSE.
              IF (ICHAR(I(XOR(POSITIONMATRIX(1,2,J), 63))) .NE.
         +      POSITIONMATRIX(2,2,J)) DECISION = .FALSE.
    70      CONTINUE
    
            IF (.NOT. DECISION) GOTO 1000
    
            WRITE(*,*) "CORRECT."
            GOTO 1001
    1000    WRITE(*,*) "WRONG FLAG."
    1001    STOP
          END

    ..? 마지막 부분을 보면 CORRECT, WRONG FLAG 가 있는 것으로 보아. 플래그를 입력받고 일치 여부를 출력해주는 프로그램인것 같은데 난생 처음보는 언어이다.

     

    .F 파일, write(*,*) 등을 키워드로 검색해보니 해당 언어가 포트란 언어임을 알게 되었다.. 포트란이라고 하면 학부생 시절 교수님이 "라떼는"을 시전하시면서 언급하셨던 언어로 기억하는데.. 무튼 문법공부를 해가면서 역분석을 시작해보았다.

     

    우선, 포트란 문법 공부는 아래 페이지에서 대부분 도움을 얻었다.

    seismic.yonsei.ac.kr/fortran/index.html 

     

    Fortran Tutorial

     

    seismic.yonsei.ac.kr

          BLOCK DATA
            INTEGER PROGRESSIONMATRIX(12), CONVOLUTIONMATRIX(4,3)
            COMMON /PERFORMANTBLOCK/ CONVOLUTIONMATRIX, PROGRESSIONMATRIX
            INTEGER POSITIONMATRIX(2,2,5)
            COMMON /SLOWBLOCK/ POSITIONMATRIX
            DATA CONVOLUTIONMATRIX/7, 13, 15, 17, 19, 24, 30, 31, 34, 37
         +  , 39, 41/
            DATA PROGRESSIONMATRIX/241, 209, 201, 243, 207, 249, 231, 251
         +  , 235, 255, 209, 201/
            DATA POSITIONMATRIX/134, 36, 175, 63, 112, 163, 111, 37, 140, 73
         +  , 172, 83, 61, 65, 135, 53, 146, 43, 157, 58/
          END
    
          PROGRAM CHRISTMAS
            LOGICAL DECISION
            INTEGER INSTRUCTION
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
            CHARACTER I(42)
            INTEGER TT(-4:0), TT2(-4:0)
            INTEGER ANTIMONY(0:4)
            INTEGER PROGRESSIONMATRIX(12), CONVOLUTIONMATRIX(4,3)
            COMMON /PERFORMANTBLOCK/ PROGRESSIONMATRIX, CONVOLUTIONMATRIX
            INTEGER POSITIONMATRIX(2,2,5)
            INTEGER A, B
            PARAMETER(AX=28, AY=48)
    
            WRITE(*,*) "PLEASE INPUT FLAG."
            DECISION = .TRUE.
            READ(*,*) I
            DATA TT/85, 32, 64, 76, 94/
            DATA ANTIMONY/0, 4, 5, 8, 12/
            DATA POSITIONMATRIX/118, 53, 43, 51, 117, 51, 41, 53, 116, 51,
         +  40, 48, 113, 48, 38, 51, 109, 52, 36, 55/
    

    위 내용은, 프로그램의 시작 및 변수 선언 부분이다.

    해당 프로그램은 CHRISTMAS 라는 프로그램이고 LOGICAL, INTEGER, CHARACTER 등 형식의 여러 변수가 선언되었음을 알 수 있다. BLOCK DATA부분에서는 선언만되어있던 변수들에 값을 넣어주는듯 하다.

     

    그럼 이제부터 부분별로 포트란코드를 분석 후 역연산을 하여 플래그를 출력해주는 python 코드를 작성하면서 문제를 해결해 보도록 하자.

     

            DO 20 J = 1, 5
              IF (XOR(ICHAR(I(J)), 13) .NE. TT(J - 5)) DECISION = .FALSE.
    20      CONTINUE

    첫 번째 부분이다.

    DO-CONTINUE문은 반복문이다. DO 뒤에 나오는 20은 해당 반복문의 라벨이고, J =1,5 는 J가 1부터 5까지 반복되며 DO와 CONTINUE 사이의 코드가 반복적으로 실행됨을 나타낸다.

    I는 사용자 입력값이며, ICHAR은 CHAR값을 INTEGER로 변환해주는 함수이다.

    예를들어 ICHAR(a)는 a의 아스키코드 값(10진수 기준)이 97 이므로 97이 될 것이다.

    .NE. 는 != 와 같으며 이를 만족하지 않았을 때 DECISION이 FALSE가 된다.

    TT(J-5)는 앞서 선언되어있던 배열의 인덱스에 대한 내용으로 우리가 익히 알던 식으로 해석 할 수 있다.

    다만 주의할점은 포트란에서는 

            INTEGER TT(-4:0), TT2(-4:0)

    과 같이 배열의 시작인덱스와 종료인덱스를 설정해줄 수 있다.

    DECISION이 FALSE가 되면 WRONG FLAG를 출력하므로, 이 반복문을 모두 만족해야한다는 것인데..

     

    이를 역연산하여 파이썬코드로 나타내면 아래와 같다.(아래 코드를 보는게 이해가 빠를것이다.)

     

    결국, 이를 변환하면

    TT=[85,32,64,76,94] # -4 ~ 0
    
    for i in range(5) :
        x=13^TT[i]
        FlagArr[i]=(chr(x))

    와 같을 것이다.

     

    그 다음 부분인,

            IF (I(6) .NE. CHAR(123)) DECISION = .FALSE.
            IF (I(42) .LT. CHAR(125)) DECISION = .FALSE.
    
            DATA TT2/8, 12, 16, 21, 26/
    
            DO 30 J = 0, -4, -1
              IF (ICHAR(I(TT2(J))) .NE. 95) DECISION = .FALSE.
    30      CONTINUE

     

    에 대해서는 추가 설명은 필요 없을 듯 하다.

    TT=[85,32,64,76,94] # -4 ~ 0
    TT2=[8,12,16,21,26] # -4 ~ 0
    
    for i in range(5) :
        x=13^TT[i]
        FlagArr[i]=(chr(x))
        
    FlagArr[5]=chr(123)
    FlagArr[41]=chr(125)

     

    다음 부분으로 넘어가자.

            DO 40 J = 1, 12, 1
              INSTRUCTION = ICHAR(I(PROGRESSIONMATRIX(J)))
              OPTIMIZE = J
              IF(ANALYZER(CONVOLUTIONMATRIX, OPTIMIZE, INSTRUCTION) 
         +    .LT. 0.5) DECISION = .FALSE.
    40      CONTINUE
    
            IF (ICHAR(I(29)) .NE. 95) DECISION = .FALSE.
            IF (ICHAR(I(35)) .NE. 95) DECISION = .FALSE.
            IF (ICHAR(I(38)) .NE. 95) DECISION = .FALSE.

    DO-CONTINUE 반복문에 J 부분 인자가 세개로 늘어났다. 이는 시작값, 끝값, 증감값 이다. 증감값이 1이므로 이전과 달라진 것은 없다.

    ICHAR(I(PROGRESSIONMATRIX(J))) 부분을 보면 I의 인덱스로 PROGRESSIONMATRIX 배열의 인덱스 값들이 들어가는데, 해당 배열의 값들은 전부 200대로 I의 길이인 42를 넘어선다.. 이부분이 이해가 가지 않아서 테스트해가면서 분석하기 위해 동적 분석 환경을 구축하였다.

    다행히 포트란을 지원하는 컴파일러가 있었다. TDM-gcc 라는 컴파일러인데, 설치 및 활용 방법은 구글링을 통해 확인하길 바란다.

     

    테스트 결과 놀랍게도 PROGRESSIONMATRIX 배열과 CONVOLUTIONMATRIX 배열의 값이 뒤바뀌어 있었다.

    (COMMON /PERFORMANTBLOCK/ PROGRESSIONMATRIX, CONVOLUTIONMATRIX 부분 때문인가..? 라는 추측이 들긴 하는데 정확한 이유는 모르겠다.)

    ANALYZER 함수는 아래와 같다.

          REAL FUNCTION ANALYZER(M, I, B)
            INTEGER M(*), I
            INTEGER B, OP
    
            OP = I           
            DO 10 I = 1, B   ##### (1) 
              B = B + 1      #####
    10      CONTINUE         #####
            I = OP
    
            OP = XOR(B, 35)
            IF (OP .EQ. M(I)) THEN
              ANALYZER = 1.0
            ELSE
              ANALYZER = 0.0
            ENDIF
    
            RETURN
          END

    (1) 반복문에 의해 B값( ICHAR(I(PROGRESSIONMATRIX(J)) ) 의 2배가 되고 그 값과 35를 XOR한 값이 PROC배열의 인덱스와 같아야 한다. (#이 실제 포트란의 주석은 아니다..)

     

    이를 역연산하여 파이썬으로 나타내면,

    #PROGRESSIONMATRIX=[241, 209, 201, 243, 207, 249, 231, 251, 235, 255, 209, 201]
    #CONVOLUTIONMATRIX=[7, 13, 15, 17, 19, 24, 30, 31, 34, 37, 39, 41] 
    CONVOLUTIONMATRIX=[241, 209, 201, 243, 207, 249, 231, 251, 235, 255, 209, 201]
    PROGRESSIONMATRIX=[7, 13, 15, 17, 19, 24, 30, 31, 34, 37, 39, 41] 
    
    for i in range(12) :
        In = i
        idx = PROGRESSIONMATRIX[i]
        #print(idx)
        x = (CONVOLUTIONMATRIX[i]^35)/2
        #print(int(x))
        FlagArr[idx-1]=chr(int(x))
        

    와 같고, 누적 결과는

    이다. (앞선 설명으로 충분히 해독할 수 있는 포트란 코드들의 파이썬 변환과정은 생략되었다.)

     

    그 다음 부분을 분석해보자.

            INSTRUCTION = 5570010
            TT(0) = 0
            DO 60 J = 0, 7
              CALL COMPUTE(LSHIFT(ICHAR(I(INT(AX + ANTIMONY(4-TT(0))))), 1)
         #,J,              INT(AY + MOD(INSTRUCTION, 10)))
    
              INSTRUCTION = INSTRUCTION / 10
              TT = TT + 1
              IF (OPTIMIZE .NE. 1) GOTO 1000
    60      CONTINUE

    주의할 점은 TT(0) 을 초기화 후 TT(0) = TT(0) + 1을 해주는 것이 아니라 TT = TT +1을 해주고 있다. 포트란에서 이와 같이 연산을 하면, TT배열의 값들이 모두 1씩 증가한다. (연산에는 TT(0)만 활용되기때문에 큰 의미는 없다.)

    또한, AX AY의 값은 이전에 PARAMETER(AX=28, AY=48) 로 선언되어 있으니 각각의 값을 활용하면 되고,

    LSHIFT는 왼쪽으로 한비트 shift시키는 함수로, 값 2배 증가를 나타낸다.

    MOD함수 또한 일반적인 % 연산과 같다.

    이어서 COMPUTE 함수를 분석 하면(FUNCTION이 아닌 SUBROUTINE 이지만 이 문제를 푸는데 두 차이는 의미가 없다.)

          SUBROUTINE COMPUTE(A, I, B)
            INTEGER A, I, B
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
    
            DO 50 I = 0, B -1
              B = B + 1
    50      CONTINUE
            I = I - 48
    
            IF (A .EQ. B) THEN
              OPTIMIZE = 1
            ELSE
              OPTIMIZE = 0
            ENDIF 
    
            RETURN
          END

    A값(ICHAR(I(INT(AX + ANTIMONY(4-TT(0))))의 두배) 와 B값(INT(AY + MOD(INSTRUCTION, 10))의 두배)가 같아야 한다.

    우리는 이제 동적 분석이 가능하므로 주어진 포트란 코드를 수정하여 I의 인덱스별 값을 출력해보았다.

     

          SUBROUTINE COMPUTE(A, I, B)
            INTEGER A, I, B
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
    		
    
    		WRITE(*,*) "B"
    		WRITE(*,*) B		
            DO 50 I = 0, B -1
              B = B + 1
    50      CONTINUE
    
    
            I = I - 48
    
    		
    
            IF (A .EQ. B) THEN
              OPTIMIZE = 1
            ELSE
              OPTIMIZE = 0
            ENDIF 
    
            RETURN
          END
          
          		WRITE(*,*) "TEST"
            INSTRUCTION = 5570010
            TT(0) = 0
            DO 60 J = 0, 7
    			WRITE(*,*) "IDX"
    			WRITE(*,*) INT(AX + ANTIMONY(4-TT(0)))-1
    			CALL COMPUTE(Y(INT(AX + ANTIMONY(4-TT(0))))
         #,J,              INT(AY + MOD(INSTRUCTION, 10)))
    			WRITE(*,*) "----------"
    			INSTRUCTION = INSTRUCTION / 10
    			TT = TT + 1
    
    60      CONTINUE
          
          

    위와 같이 포트란코드를 수정 후 결과를 확인해보면.

    이다. 이를 파이썬 코드에 하드코딩시키면 

    아래와 같다.

     

    마지막 부분이다.

            DO 70 J = 1, 5
              IF (ICHAR(I(XOR(POSITIONMATRIX(1,1,J), 127))) .NE.
         +      POSITIONMATRIX(2,1,J)) DECISION = .FALSE.
              IF (ICHAR(I(XOR(POSITIONMATRIX(1,2,J), 63))) .NE.
         +      POSITIONMATRIX(2,2,J)) DECISION = .FALSE.
    70      CONTINUE

    기존에 설명했던 부분을 익혔다면 어려운 내용은 아니지만 3차원 배열의 활용 방법이 헷갈린다..

    위 이미지는 이동중이었나.. 자기 전 누워서였나.. 핸드폰으로 포트란 배열에 대해 공부한 내용을 캡쳐해놓은 것인데

    (해당 자료 링크를 다시 찾을 수가 없다 ㅠ)

    이를 참고해서 파이썬으로 구현을 해도 되지만 나는 J를 기준으로 4개의 배열을 새로 만들어서 활용하였다. 

    		WRITE(*,*) "o_o"		
    		DO 10 J =1,5
    			WRITE(*,*) POSITIONMATRIX(1,1,J)
    10		CONTINUE
    
    		WRITE(*,*) "t_o"
    		DO 20 J =1,5
    			WRITE(*,*) POSITIONMATRIX(2,1,J)
    20		CONTINUE
    
    		WRITE(*,*) "o_t"
    		DO 30 J =1,5
    
    			WRITE(*,*) POSITIONMATRIX(1,2,J)
    30		CONTINUE
    
    		WRITE(*,*) "t_t"
    		DO 40 J =1,5
    			WRITE(*,*) POSITIONMATRIX(2,2,J)
    40		CONTINUE

    와 같은 테스트 포트란 코드를 통해서 

    의 결과 값을 얻었고, 이를 파이썬 코드에 적용시켜 최종 플래그를 획득하였다.

    o_o=[0,118, 117, 116, 113, 109] # 1,1,J
    t_o=[0,53,51,51,48,52] # 2,1,J
    o_t=[0,43,41,40,38,36] # 1,2,J
    t_t=[0,51,53,48,51,55] # 2,2,J 
    
    for i in range(5) :
        i=i+1
        idx1= (o_o[i]^127)-1
    
        #print(idx1)
        FlagArr[idx1]=chr(t_o[i])
        
        idx2= (o_t[i]^63)-1
    
        #print(idx2)
        FlagArr[idx2]=chr(t_t[i])

    FLAG = X-MAS{i_533_y0u_h4v3_50m3_77_bl00d_1n_y0u}

     

    -----------------------------------------------------------------------------------------------------------------------------------

     

    <참고>

    최종 파이썬 코드

    TT=[85,32,64,76,94] # -4 ~ 0
    TT2=[8,12,16,21,26] # -4 ~ 0
    #PROGRESSIONMATRIX=[241, 209, 201, 243, 207, 249, 231, 251, 235, 255, 209, 201]
    #CONVOLUTIONMATRIX=[7, 13, 15, 17, 19, 24, 30, 31, 34, 37, 39, 41] # 2
    CONVOLUTIONMATRIX=[241, 209, 201, 243, 207, 249, 231, 251, 235, 255, 209, 201]
    PROGRESSIONMATRIX=[7, 13, 15, 17, 19, 24, 30, 31, 34, 37, 39, 41] # 2
    ANTIMONY=[0, 4, 5, 8, 12]
    POSITIONMATRIX=[134, 36, 175, 63, 112, 163, 111, 37, 140, 73, 172, 83, 61, 65, 135, 53, 146, 43, 157, 58]
    
                    
    
    FlagArr=[]
    Flag=''
    for i in range(42) :
        FlagArr.append('*')
    
    
    for i in range(5) :
        x=13^TT[i]
        FlagArr[i]=(chr(x))
    
    FlagArr[5]=chr(123)
    FlagArr[41]=chr(125)
    
    for i in range(5) :
        FlagArr[TT2[-1-i]-1]=chr(95)
    
    for i in range(12) :
        In = i
        idx = PROGRESSIONMATRIX[i]
        x = (CONVOLUTIONMATRIX[i]^35)/2
        FlagArr[idx-1]=chr(int(x))
        
    FlagArr[28]=chr(95)
    FlagArr[34]=chr(95)
    FlagArr[37]=chr(95)
    
    FlagArr[39]=chr(48)
    FlagArr[35]=chr(49)
    FlagArr[32]=chr(48)
    FlagArr[31]=chr(48)
    FlagArr[27]=chr(55)
    
    
    INSTRUCTION = 5570010
    TT[4] = 0
    
    o_o=[0,118, 117, 116, 113, 109] # 1,1,J
    t_o=[0,53,51,51,48,52] # 2,1,J
    o_t=[0,43,41,40,38,36] # 1,2,J
    t_t=[0,51,53,48,51,55] # 2,2,J 
    
    for i in range(5) :
        i=i+1
        idx1= (o_o[i]^127)-1
    
        FlagArr[idx1]=chr(t_o[i])
        
        idx2= (o_t[i]^63)-1
    
        FlagArr[idx2]=chr(t_t[i])
    
    #print
    for i in range(42) :
        Flag+=FlagArr[i]
        
    
    print(Flag)
    

    테스트 포트란 코드

          SUBROUTINE COMPUTE(A, I, B)
            INTEGER A, I, B
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
    		
    
    		WRITE(*,*) "Value"
    		WRITE(*,*) B		
            DO 50 I = 0, B -1
              B = B + 1
    50      CONTINUE
    
    
            I = I - 48
    
    		
    
            IF (A .EQ. B) THEN
              OPTIMIZE = 1
            ELSE
              OPTIMIZE = 0
            ENDIF 
    
            RETURN
          END
    
          BLOCK DATA
            INTEGER PROGRESSIONMATRIX(12), CONVOLUTIONMATRIX(4,3)
            COMMON /PERFORMANTBLOCK/ CONVOLUTIONMATRIX, PROGRESSIONMATRIX
            INTEGER POSITIONMATRIX(2,2,5)
            COMMON /SLOWBLOCK/ POSITIONMATRIX
            DATA CONVOLUTIONMATRIX/7, 13, 15, 17, 19, 24, 30, 31, 34, 37
         +  , 39, 41/
            DATA PROGRESSIONMATRIX/241, 209, 201, 243, 207, 249, 231, 251
         +  , 235, 255, 209, 201/
            DATA POSITIONMATRIX/134, 36, 175, 63, 112, 163, 111, 37, 140, 73
         +  , 172, 83, 61, 65, 135, 53, 146, 43, 157, 58/
          END
    
          PROGRAM CHRISTMAS
            LOGICAL DECISION
            INTEGER INSTRUCTION
            INTEGER OPTIMIZE
            COMMON /PRAGMA/ OPTIMIZE
            CHARACTER I(42)
    		CHARACTER X(42)
    		INTEGER Y(42)
            INTEGER TT(-4:0), TT2(-4:0)
            INTEGER ANTIMONY(0:4)
            INTEGER PROGRESSIONMATRIX(12), CONVOLUTIONMATRIX(4,3)
            COMMON /PERFORMANTBLOCK/ PROGRESSIONMATRIX, CONVOLUTIONMATRIX
            INTEGER POSITIONMATRIX(2,2,5)
            INTEGER A, B
            PARAMETER(AX=28, AY=48)
    		
    		
    		DATA TT/85, 32, 64, 76, 94/
            DATA ANTIMONY/0, 4, 5, 8, 12/
            DATA POSITIONMATRIX/118, 53, 43, 51, 117, 51, 41, 53, 116, 51,
         +  40, 48, 113, 48, 38, 51, 109, 52, 36, 55/
            DATA TT2/8, 12, 16, 21, 26/
    		DATA X/"*", "*", "*", "*", "*", "*", "*", "*", "*", "*", "*",
         +  "*", "*", "*", "*", "*", "*", "*", "*", "*", "*", "*",
         +  "*", "*", "*", "*", "*", "*", "*", "*", "*", "*", "*",
         +  "*", "*", "*", "*", "*", "*", "*", "*", "*"/
    		DATA Y/1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
         +  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
         +  23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
         +  34, 35, 36, 37, 38, 39, 40, 41, 42/
    
    		
    		WRITE(*,*) "WHAT??"
    		WRITE(*,*) "PROG"
    		WRITE(*,*) PROGRESSIONMATRIX
    		WRITE(*,*) "CONV"
    		WRITE(*,*) CONVOLUTIONMATRIX	
    		WRITE(*,*) Y(INT(AX + ANTIMONY(4-TT(0))))
    		WRITE(*,*) LSHIFT(2,1)
    		
    		WRITE(*,*) "o_o"		
    		DO 10 J =1,5
    			WRITE(*,*) POSITIONMATRIX(1,1,J)
    10		CONTINUE
    
    		WRITE(*,*) "t_o"
    		DO 20 J =1,5
    			WRITE(*,*) POSITIONMATRIX(2,1,J)
    20		CONTINUE
    
    		WRITE(*,*) "o_t"
    		DO 30 J =1,5
    
    			WRITE(*,*) POSITIONMATRIX(1,2,J)
    30		CONTINUE
    
    		WRITE(*,*) "t_t"
    		DO 40 J =1,5
    			WRITE(*,*) POSITIONMATRIX(2,2,J)
    40		CONTINUE
    
    		WRITE(*,*) "TEST"
            INSTRUCTION = 5570010
            TT(0) = 0
            DO 60 J = 0, 7
    			WRITE(*,*) "IDX"
    			WRITE(*,*) INT(AX + ANTIMONY(4-TT(0)))-1
    			CALL COMPUTE(Y(INT(AX + ANTIMONY(4-TT(0))))
         #,J,              INT(AY + MOD(INSTRUCTION, 10)))
    			WRITE(*,*) "----------"
    			INSTRUCTION = INSTRUCTION / 10
    			TT = TT + 1
    
    60      CONTINUE
    			
    
    		READ(*,*) I
          END
    반응형

    댓글

Designed by Tistory.