ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NCSC CTF 2019 [Reversing]2factorauth write up
    CTF write_up/NCSC CTF 2019. 2. 9. 01:19

    ↑문제 파일

    파일을 실행해 보니 다음과 같이 PASSWORD1 물어보고는 답이 아닌지 :( 출력하네요

     

    어떤 파일로 이루어 졌는지 보겠습니다.

    ELF 파일로 되어 있네요.

    IDA 이용해서 분석해 보겠습니다.

    main 함수

     

    일단 fgets 11글자를 입력으로 받고 길이 만큼 rot13함수를 반복 시키네요

    rot13함수를 한번 보겠습니다.

    아스키 코드를 이용해서 13 더하고 빼는 함수 같네요

     

    그리고 memfrob함수를 거쳐서 test test1 비교해서 같으면 넘어가고 다르면 아까 처럼 :( 출력되는 같습니다.

     

    memfrob함수는 42 XOR하는 함수 입니다.

     

    따라서 역연산 시에 42 XOR해야합니다.

     

    25번줄 부터 보면 이번엔 PASSWORD2 숫자를 입력합니다.

     

    v4 = (14 * (((v8 | 0x40) - 0x5318414) | 0x10000) >> 1) - 0x3B93AE7C;

    BYTE1(v4) &= 0x7Fu;

    거쳐서 v4 0xFFFFFFFFBB7C4CDC 비교 합니다.

     

    문제를 해결할 python코드를 작성해 보겠습니다.

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    from z3 import *

    import string

    rot13Table = string.maketrans( 

        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

        "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")

    rot13 = lambda s : string.translate(s, rot13Table)

     

    PASSWORD1 = [0x490x4F0x190x6D0x6D0x460x750x190x1E0x4C0x66]

    PASSWORD1_s = ""

    for i in xrange(len(PASSWORD1)):

        PASSWORD1_s += chr(PASSWORD1[i] ^ 42)

    var = BitVec("var"64)

    = Solver()

    s.add(((14 * (((var | 0x40- 87131156| 0x10000>> 1- 999534204== 0xFFFFFFFFBB7C4CDC)

    s.check()

    = s.model()

    print 'PASSWORD1 : ' + rot13(PASSWORD1_s) + '\nPASSWORD2 : ' + str(m[var].as_long())

    위의 소스코드를 실행시켜 보면 다음과 같습니다.

    해당 flag값을 넣어보겠습니다.

    틀렸다고 나옵니다..

     

    생각해보니 수식에 해당하는 값이 1개가 아닐수도 있다는 생각이 들었습니다.

    그래서 코드에 해당값인 65710012 나오지 않도록 추가하고 다시 돌려보겠습니다.

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    from z3 import *

    import string

    rot13Table = string.maketrans( 

        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

        "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")

    rot13 = lambda s : string.translate(s, rot13Table)

     

    pw1 = [0x490x4F0x190x6D0x6D0x460x750x190x1E0x4C0x66]

    pw1_s = ""

    for i in xrange(len(pw1)):

        pw1_s += chr(pw1[i] ^ 42)

    var = BitVec("var"64)

    = Solver()

    s.add(var != 65710012)

    s.add(((14 * (((var | 0x40- 87131156| 0x10000>> 1- 999534204== 0xFFFFFFFFBB7C4CDC)

    s.check()

    = s.model()

    print 'PASSWORD1 : ' + rot13(pw1_s) + '\nPASSWORD2 : ' + str(m[var].as_long())

     

    아까와는 다른 값이 나왔습니다. Flag 넣어 보겠습니다.

    이번에도 아니네요 똑같은 방법으로 65710076 제외시키고 코드를 실행해 보겠습니다.

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    from z3 import *

    import string

    rot13Table = string.maketrans( 

        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

        "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")

    rot13 = lambda s : string.translate(s, rot13Table)

     

    pw1 = [0x490x4F0x190x6D0x6D0x460x750x190x1E0x4C0x66]

    pw1_s = ""

    for i in xrange(len(pw1)):

        pw1_s += chr(pw1[i] ^ 42)

    var = BitVec("var"64)

    = Solver()

    s.add(var != 65710012)

    s.add(var != 65710076)

    s.add(((14 * (((var | 0x40- 87131156| 0x10000>> 1- 999534204== 0xFFFFFFFFBB7C4CDC)

    s.check()

    = s.model()

    print 'PASSWORD1 : ' + rot13(pw1_s) + '\nPASSWORD2 : ' + str(m[var].as_long())

    Flag값이 나왔으니 다시 넣어보겠습니다.

    성공!

     

    Flag : securinets{pr3TTy_34sY_3e9a7bc}


    댓글

Designed by Tistory.