Layer7 동아리 과제

리버싱 10차시 과제

msh1307 2022. 8. 23. 22:44

Prob-begin

IDA로 디컴파일한 모습이다. 

v5에 16글자를 입력받는다. 

그리고 16글자 4바이트씩 쪼개서 a1에 집어넣는다. 

stub에 따라서 다른 명령을 수행한다.

stub의 모습이다.

stub를 해석하는 프로그램을 작성했다.

위와 같은 결과를 얻을 수 있다.

32비트짜리라서 0xffffffff를 and 해줬다.

 

initcpu 함수에서 아래와 같은 동작을 수행한다.

v4[0] = v5[0] 

v4[1] = v5[1]

v4[2] = v5[2]

v4[3] = v5[3]

 

v4는 총 8개가 존재하고 32비트이다.

일종의 레지스터 역할이다. 

8개의 32비트 레지스터 중 4개가 사용자의 입력을 받아서 설정된다.

그 4개의 레지스터를 미지수로 설정한다.

그다음 v4[7] == 0이라는 조건을 만족시키는 미지수를 찾으면 flag를 얻을 수 있다.

 

4개를 32비트 BitVec으로 만들고, 나머지는 4개는 0으로 채웠다.

아까 출력된 거 그대로 복사하고 붙여 넣었다.

리틀 엔디안 고려하고 4바이트인 거 생각하면 FLAG를 뒤집어줘야 한다.

그리고 hex로 출력한다.

이제 hex to string

이거 복사해서 거꾸로 바꿔주자.

 

L7{VM_BEGINNER!} 

 

Prob-1

 

IDA로 디컴파일한 모습이다.

flag 입력받고, v5에 나눠서 넣어준다.

run_cpu의 일부다. 

여기서 stub 보고 명령을 처리한다.

그냥 이거 나온 거 그대로 처리하도록 파이썬으로 구현해주면 된다.

a1을 레지스터라고 부르겠다.

여기서 레지스터는 64비트다.

위처럼 stub를 unsigned int로 4바이트를 긁어올 수도 있고, 아래처럼 8바이트를 긁어서 레지스터에 넣을 수도 있다.

4바이트나 8바이트 긁는 경우에는 리틀 엔디안 고려해서 뒤에서부터 긁어주면 쉽게 계산할 수 있다.

아래 Python 사용해서 stub를 긁었다.

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
data = [4620942042344838271601371182068220246564162652424620233165851089314884231239046201771652382022890701871182017212233131738119714723901442025327424498214941462113211114024914196742071182115518122914017021774884621101572409611801153523914621117392362778157715111821244224162131214191992102391144213612501752375620313646221071821172067520623421211822842321371752389715321246221681338124611591362002392462217115029108156701831881182217714326311848020211323921442222160224252342265418946232122322163118663769111823166106163214232622072354623791311720618915911732393462359240311455249241961182316212419396171231992223931442316387130551782312447446241432291524212694211351182411916571111641261082144624176237625619510610514123944624911587420329222169173118241191962086517635223723941442453121811458529149484625212184298462641138511825344761281862112917546252324034217116752585239546257132291771873124014611825741152231374854219239514425211117232212172348232145015014501511450152145015314501541450155204]
 
= 0
cur = 0
def t(a):
    return hex(a).replace('0x','').rjust(2,'0')
 
while True:
    s = data[cur]
    if(s == 0xcc):
        break
    if(s == 0xba):
        s = data[cur+1]
        if(s): #cur+3 cur+4 cur+5 cur+6
            if(s == 1):
                print("REG[%d] = %d" %(data[cur+2], int(t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]+t),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 7
            else#cur+3 cur+4 cur+5 cur+6 cur+7 cur+8 cur+9 cur+10
                if(s != 2):
                    print("NOP!")
                print("REG[%d] = %d" %(data[cur+2], int(t(data[cur+10])+t(data[cur+9])+t(data[cur+8])+t(data[cur+7])+t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 11
        else:
            print("REG[%d] = REG[%d]" %(data[cur+2], data[cur+3]))
            print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
            cur += 4
    elif(s == 0x76):
        s = data[cur+1]
        s = data[cur+1]
        if(s): #cur+3 cur+4 cur+5 cur+6
            if(s == 1):
                print("REG[%d] += %d" %(data[cur+2], int(t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]+t),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 7
            else#cur+3 cur+4 cur+5 cur+6 cur+7 cur+8 cur+9 cur+10
                if(s != 2):
                    print("NOP!")
                print("REG[%d] += %d" %(data[cur+2], int(t(data[cur+10])+t(data[cur+9])+t(data[cur+8])+t(data[cur+7])+t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 11
        else:
            print("REG[%d] += REG[%d]" %(data[cur+2], data[cur+3]))
            print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
            cur += 4
    elif(s == 0x90):
        s = data[cur+1]
        if(s): #cur+3 cur+4 cur+5 cur+6
            if(s == 1):
                print("REG[%d] -= %d" %(data[cur+2], int(t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]+t),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 7
            else#cur+3 cur+4 cur+5 cur+6 cur+7 cur+8 cur+9 cur+10
                if(s != 2):
                    print("NOP!")
                print("REG[%d] -= %d" %(data[cur+2], int(t(data[cur+10])+t(data[cur+9])+t(data[cur+8])+t(data[cur+7])+t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 11
        else:
            print("REG[%d] -= REG[%d]" %(data[cur+2], data[cur+3]))
            print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
            cur += 4
    elif(s == 0x83):
        s = data[cur+1]
        if(s): #cur+3 cur+4 cur+5 cur+6
            if(s == 1):
                print("REG[%d] &= %d" %(data[cur+2], int(t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]+t),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 7
            else#cur+3 cur+4 cur+5 cur+6 cur+7 cur+8 cur+9 cur+10
                if(s != 2):
                    print("NOP!")
                print("REG[%d] &= %d" %(data[cur+2], int(t(data[cur+10])+t(data[cur+9])+t(data[cur+8])+t(data[cur+7])+t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 11
        else:
            print("REG[%d] &= REG[%d]" %(data[cur+2], data[cur+3]))
            print("REG[%d] &= 0xffffffffffffffff")
            cur += 4
    elif(s == 0x91):
        s = data[cur+1]
        if(s): #cur+3 cur+4 cur+5 cur+6
            if(s == 1):
                print("REG[%d] |= %d" %(data[cur+2], int(t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]+t),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 7
            else#cur+3 cur+4 cur+5 cur+6 cur+7 cur+8 cur+9 cur+10
                if(s != 2):
                    print("NOP!")
                print("REG[%d] |= %d" %(data[cur+2], int(t(data[cur+10])+t(data[cur+9])+t(data[cur+8])+t(data[cur+7])+t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 11
        else:
            print("REG[%d] |= REG[%d]" %(data[cur+2], data[cur+3]))
            print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
            cur += 4
    elif(s == 0xef):
        print("REG[%d] = ~REG[%d]" %(data[cur+1], data[cur+1]))
        cur += 2
    elif(s == 0x2e):
        s = data[cur+1]
        s = data[cur+1]
        if(s): #cur+3 cur+4 cur+5 cur+6
            if(s == 1):
                print("REG[%d] ^= %d" %(data[cur+2], int(t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]+t),16)))
                print("REG[%d] &= 0xffffffffffffffff")
                cur += 7
            else#cur+3 cur+4 cur+5 cur+6 cur+7 cur+8 cur+9 cur+10
                if(s != 2):
                    print("NOP!")
                print("REG[%d] ^= %d" %(data[cur+2], int(t(data[cur+10])+t(data[cur+9])+t(data[cur+8])+t(data[cur+7])+t(data[cur+6])+t(data[cur+5])+t(data[cur+4])+t(data[cur+3]),16)))
                print("REG[%d] &= 0xffffffffffffffff"%data[cur+2])
                cur += 11
        else:
            print("REG[%d] ^= REG[%d]" %(data[cur+2], data[cur+3]))
            print("REG[%d] &= 0xffffffffffffffff")
            cur += 4
    else:
        print("NOP!")
 
cs

그대로 구현해줬다.

엄청 많이 나온다.

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from z3 import * 
 
FLAG = [BitVec('FLAG_%d'%i,64for i in range(6)]
REG = FLAG + [0* 10
REG[0] ^= 9916956230313233502
REG[0&= 0xffffffffffffffff
REG[0+= 17456412026526424132
REG[0&= 0xffffffffffffffff
REG[0] ^= 16669111249775470057
REG[0&= 0xffffffffffffffff
REG[0= ~REG[0]
REG[0] ^= 13494573269112497585
REG[0&= 0xffffffffffffffff
REG[0+= 10648006697692025873
REG[0&= 0xffffffffffffffff
REG[0= ~REG[0]
REG[0-= 98751962342359805
REG[0&= 0xffffffffffffffff
REG[1] ^= 14936966682722987908
REG[1&= 0xffffffffffffffff
REG[1+= 6362136750145779099
REG[1&= 0xffffffffffffffff
REG[1] ^= 2554385922081725706
REG[1&= 0xffffffffffffffff
REG[1= ~REG[1]
REG[1] ^= 10882839983365564277
REG[1&= 0xffffffffffffffff
REG[1+= 15160171698711617780
REG[1&= 0xffffffffffffffff
REG[1= ~REG[1]
REG[1-= 9857034802924911908
REG[1&= 0xffffffffffffffff
REG[2] ^= 15342301905572705899
REG[2&= 0xffffffffffffffff
REG[2+= 15319383285252614228
REG[2&= 0xffffffffffffffff
REG[2] ^= 14449974489168053672
REG[2&= 0xffffffffffffffff
REG[2= ~REG[2]
REG[2] ^= 13598415237511222955
REG[2&= 0xffffffffffffffff
REG[2+= 8199454823307448241
REG[2&= 0xffffffffffffffff
REG[2= ~REG[2]
REG[2-= 13634334416995106013
REG[2&= 0xffffffffffffffff
REG[3] ^= 6578703224312228052
REG[3&= 0xffffffffffffffff
REG[3+= 16991869088846539430
REG[3&= 0xffffffffffffffff
REG[3] ^= 249280991950343503
REG[3&= 0xffffffffffffffff
REG[3= ~REG[3]
REG[3] ^= 6985638513559728187
REG[3&= 0xffffffffffffffff
REG[3+= 1613387814777486498
REG[3&= 0xffffffffffffffff
REG[3= ~REG[3]
REG[3-= 5401196605745551267
REG[3&= 0xffffffffffffffff
REG[4] ^= 2581510910733444495
REG[4&= 0xffffffffffffffff
REG[4+= 15450863666303837559
REG[4&= 0xffffffffffffffff
REG[4] ^= 10189793018597273008
REG[4&= 0xffffffffffffffff
REG[4= ~REG[4]
REG[4] ^= 12513777259171716699
REG[4&= 0xffffffffffffffff
REG[4+= 17092290541331203191
REG[4&= 0xffffffffffffffff
REG[4= ~REG[4]
REG[4-= 3500736538697890101
REG[4&= 0xffffffffffffffff
REG[5] ^= 6156772802035562708
REG[5&= 0xffffffffffffffff
REG[5+= 12618474528927264546
REG[5&= 0xffffffffffffffff
REG[5] ^= 6132015332872876055
REG[5&= 0xffffffffffffffff
REG[5= ~REG[5]
REG[5] ^= 10587997614938883079
REG[5&= 0xffffffffffffffff
REG[5+= 15795865682399464266
REG[5&= 0xffffffffffffffff
REG[5= ~REG[5]
REG[5-= 16730897981035279827
REG[5&= 0xffffffffffffffff
REG[15|= REG[0]
REG[15&= 0xffffffffffffffff
REG[15|= REG[1]
REG[15&= 0xffffffffffffffff
REG[15|= REG[2]
REG[15&= 0xffffffffffffffff
REG[15|= REG[3]
REG[15&= 0xffffffffffffffff
REG[15|= REG[4]
REG[15&= 0xffffffffffffffff
REG[15|= REG[5]
REG[15&= 0xffffffffffffffff
 
= Solver()
s.add(REG[15== 0)
s.check()
= s.model()
FLAG = FLAG[::-1]
for i in FLAG:
    print(hex(m[i].as_long()).replace('0x',''),end='')
 
 
cs

복붙 하고 리틀 엔디안 고려하면서 풀어주면 된다.

hex to string converter 돌리자.

이거 이제 거꾸로 돌리면 된다.

L7{DO_U_HAVE_HEXRAYS_FOR_VIRTUAL_MACHINE?}

'Layer7 동아리 과제' 카테고리의 다른 글

포너블 1차시 실습 라업  (0) 2022.09.14
리버싱 11차시 과제  (0) 2022.08.30
리버싱 9차시 과제  (0) 2022.08.16
리버싱 8차시 과제  (0) 2022.08.10
리버싱 7차시 과제  (0) 2022.08.08