본문 바로가기

CTF

[Codegate 2017] EasyCrack 101

Codegate 2017 EasyCrack 101 reversing 문제이다.

Binary.zip 파일을 다운받으면 해당 파일안에 101개의 바이너리 파일이 들어있다. 

바이너리 파일 101개의 key값들을 구한 후에 해당 사이트에 key를 순서대로 넣는다면 flag가 나올 것 같다.

일단 prob1을 열어봤다.

 

main

sub_400697

인자값을 받은 후 인자를 Check 하는 간단한 크랙이다.

101개 각각의 바이너리 key를 구해야한다.

하나하나 잡는건 너무 비효율적이라고 생각하여 angr를 사용하였다.

일단 angr를 사용할 시 필요한 부분은 find(Correct 문) 주소이다.

avoid 주소는 없어도 되지만 있다면 angr의 속도를 높여줄 수 있다.

다행인 것은 101개의 바이너리 동작구조가 모두 동일하다는 점이다.

그렇기에 나는 objdump 를 이용해 find_address를 어떻게 구할지에 초점을 맞췄다.

 

Correct 문과 fail 문을 출력하기 때문에 grep으로 puts만 필터링해서 추출해주었다.

위에 보이는 사진 3개는 prob1, 2, 3 파일들을 objdump로 확인한 모습이다.

여기서 볼 수 있는 공통점은 callq 400520 puts 함수에서 Correct문과 fail문을 출력한다는 사실이다.

prob1로 예를 들자면 

400df4: e8 27 f7 ff ff        callq  400520 <puts@plt>

400e00: e8 1b f7 ff ff        callq  400520 <puts@plt>

400520 puts를 기준으로 위에 있는 400df4 주소가 Correct 문을 띄우는 주소 즉 find_address다

400520 puts를 기준으로 아래에 있는 400e00 주소가 fail 문을 띄우는 주소 즉 avoid_address가 된다.

이 공통 구조가 prob1 ~ 101 모든 바이너리 파일에 알맞는다.

그렇기에 이를 토대로 find_address 와 avoid_address를 구할 수 있다.

공통점은 <puts@plt> 이므로 저 문자열을 grep으로 필터링 해주면 

 

Correct 문과 Fail 문을 출력하는 함수 두개만 필터링 되서 나오게 된다.

이제 저 앞에 있는 주소만 불러오면 되므로 해당 주소 뒤에 공통적으로 붙어있는 ":" 를 기준으로 나눠주는 코드를 작성하였다.

 

[Create_addr]

1
2
3
4
5
6
7
8
9
10
11
12
def create_addr(name):
    cmd = 'objdump -d -S -l ' + name + ' | grep \<puts@plt\>'
    out = subprocess.check_output(cmd, shell=True, stderr=subprocess.PIPE)
    first = out.index(':'#first ':'
 
    second = out[first + 1:].index(':'+ first + 1 #second ':' (find_addr)
    find_addr = out[second - 6 : second]
 
    third = out[second + 1:].index(':'+ second + 1 #third ':' (avoid_addr)
    avoid_addr = out[third - 6 : third]
    return find_addr, avoid_addr
 
cs

이제 angr 코드 짜서 마무리하면 된다.

 

[Solve]

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
import angr
import claripy
import subprocess
 
 
def create_addr(name):
    cmd = 'objdump -d -S -l ' + name + ' | grep \<puts@plt\>'
    out = subprocess.check_output(cmd, shell=True, stderr=subprocess.PIPE)
    first = out.index(':'#first ':'
 
    second = out[first + 1:].index(':'+ first + 1 #second ':' (find_addr)
    find_addr = out[second - 6 : second]
 
    third = out[second + 1:].index(':'+ second + 1 #third ':' (avoid_addr)
    avoid_addr = out[third - 6 : third] 
    return find_addr, avoid_addr
 
 
def prob_solve(name, find_addr, avoid_addr):
    project = angr.Project(name)
    argv1 = claripy.BVS("argv1"100*8)
    initial_state = project.factory.path(args=[name, argv1])
 
    pg = project.factory.path_group(initial_state)
    pg.explore(find=int(find_addr, 16), avoid=int(avoid_addr, 16))
    found = pg.found[0]
    solution = found.state.se.any_str(argv1)
    solution = solution[:solution.find("\x00")]
 
    return solution
 
 
if __name__ == "__main__":
    f = open('prob_key''w')
    for i in range(1102):
    name = 'prob' + str(i)
    find_addr, avoid_addr = create_addr(name)
    key = prob_solve(name, find_addr, avoid_addr)
    f.write(name + ': ' + find_addr + ' ' + avoid_addr + ' = ' + key + '\n')
    f.close()
cs

 

[prob_key]

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
prob1: 400df4 400e00 = T}gTRvNZAK_Exv^vqpDwCW
prob2: 400ca8 400cb4 = }hGafk~acCtypkaEoi||f}tzsr
prob3: 40102a 401036 = ELFT[^MYLINQMI_FQFYKOOZ^U
prob4: 400c75 400c81 = <D8;F9G?:0A01?E8@A92
prob5: 401130 40113c = JI^pYCXpFZuS[STOZWqvVJFWW
prob6: 4011ec 4011f8 = 0:B3:91[Y&7913F_30OZ
prob7: 400cd8 400ce4 = WIVT|ANQCKACJLPRWJ}RRBA
prob8: 400c98 400ca4 = 1:5=926;:7696040678854
prob9: 400c0c 400c18 = WUYUYYSYQPSMURTWRVPWVRSXXSZY
prob10: 4011cd 4011d9 = MSTBCCMSWNMTMMDO@UJSOLLMSAT
prob11: 401099 4010a5 = BD92A76;@D>>6E8FG05?F?G6C
prob12: 401188 401194 = DEEEDDEDEDDEDEEEEDDDEDEEEED
prob13: 400ec3 400ecf = I@P}Y|mB|x@MuXAl|u_RoxCn|jD
prob14: 4012c9 4012d5 = 5??;>>:<95;>845?9;:8:?4
prob15: 400e2a 400e36 = GAGA@GGAG@@G@AAA@A@A@AAAG
prob16: 400cf2 400cfe = LDLFDBNLALGOCDFOCAMGLDFJMBO
prob17: 400ff3 400fff = ELZyoZRiERGGxpSNH~R]qtwWEo@o
prob18: 400fa3 400faf = FEB{E{zBFFD}DFEB@@zzCF{xB
prob19: 400db1 400dbd = ;;:;;:;:;:;:;;;::::;:;;:;::
prob20: 400e32 400e3e = vnbcwgqsuefggl|mpqboic
prob21: 401273 40127f = HLLLILJHHJJHIKHJMMHK
prob22: 400c5e 400c6a = RQyBKyODWSDIEGQNSMSOTFHO
prob23: 400e76 400e82 = 5676;13=;+;5+=0;<><6:859>:08
prob24: 400e45 400e51 = ^<.:Q%.)W,.><VS,$8:7X55=*U/%
prob25: 400bbe 400bca = >:?<:<??>?>>=>>>=<:=
prob26: 400fa7 400fb3 = ===9=<:=><=<=?=;89?8::??<
prob27: 400d2a 400d36 = Kptq~HqIIwKrHrprs~vw
prob28: 400dc0 400dcc = SSPRWPkVRkRkRkQRVSPVU
prob29: 400e11 400e1d = J464=D>5.OAGRJ472*)TIT:J=
prob30: 400ff9 401005 = ALMNBBOJqNDODKBrHO__GrIqMOMK
prob31: 400fe9 400ff5 = 5+0356*=3?5=+2=>5>67845
prob32: 401172 40117e = 161=5=?32<?2=211?><3:;11
prob33: 400cbd 400cc9 = ppvqppqvppqvvqpqqqqvqpqvqvpvq
prob34: 400f4a 400f56 = @RxjcJkdpO}[pIJiFGUtnhKTvay
prob35: 400c2e 400c3a = hSZFDatdwHvTo_hbhMEMHN[
prob36: 401079 401085 = VO^AP_EUSSR@VLANHQSMCTKANWT@A
prob37: 400dc2 400dce = CFCAFKLLFCAMMFNAOEBLAEL@E
prob38: 40119c 4011a8 = xmo~zclqi}mdgwf{oovqmbpucto
prob39: 4010e5 4010f1 = MJEQFIRDRLKOJIEPIOOGWQFN
prob40: 401285 401291 = uwsuptquzwzzqwxp~zzu~y
prob41: 400ce5 400cf1 = )+*/,*)-.,..)+,-).-)-
prob42: 400fea 400ff6 = HOHOOOHHHOOOOHHOOOOOHOHHHHOOO
prob43: 400ed8 400ee4 = YMNJMGFOFODYAJDOL@OAMMNYBJDGO
prob44: 4010d8 4010e4 = -)--,.(*)/)..*.-,)-(..-
prob45: 401022 40102e = bskndsifjscahcklhppaq
prob46: 400d84 400d90 = CGFGGCFHCFEFCEEDGGEFDFCH
prob47: 400e33 400e3f = DTOIFLYFUD@OZPGPRDLXT
prob48: 40106d 401079 = WtFGGP^^@LuCCE^YuKAYIO
prob49: 400f7f 400f8b = 0q7a>>>B<gDwPFpi_5AbxwX
prob50: 400cee 400cfa = TB@YZKTYYEPSNP@OAK@YHG
prob51: 401133 40113f = 5?254=5822<??8=43556826<834
prob52: 400f0b 400f17 = NMIIJMMKHOKMMLOMKLLMKLNOJKLNM
prob53: 400ec7 400ed3 = 792<=>75=9=4<52;=6219:9:;9=<
prob54: 400f87 400f93 = :4(&>)3+;3&.15=3?%=6
prob55: 401188 401194 = NLGDGJOHLMLEKFHEHMDFLNMKIFMNI
prob56: 400f06 400f12 = uwuuvwuwvvvwwvuvuwwvwvuuvvuv
prob57: 400e4c 400e58 = @DRS@UBRPWXUIJPBNK{WOyAZWZFSX
prob58: 400f06 400f12 = NIAFK{HBJ|qNC|CzDCzNpNTTKpM
prob59: 401084 401090 = jroo|zniylzuxs}rtymoqkr
prob60: 400fa5 400fb1 = ;8::<<=:;;:8;<;>;;;=<<;:
prob61: 40106b 401077 = TTKUUTKKKTUUTKUTKTKUUUTKUTKKT
prob62: 400e21 400e2d = uOlWq^~nQN^crr@hXShtOD
prob63: 400f73 400f7f = bNw~_z}~AHbrk{XBeH_}
prob64: 4010ac 4010b8 = EDEDDEEDEDEDDEEEDDDEDEEDEDE
prob65: 400ecc 400ed8 = SfhUoj[PkRhlVSQVZRhhS[PQVe
prob66: 400ea7 400eb3 = rsrqiqooolilnqmqnnmonmho
prob67: 400fb4 400fc0 = -15w(=b(a{lok2vTh>j-Ho
prob68: 4010e9 4010f5 = SSRQSSSRQSSSSSSRQSRQQRSSQR
prob69: 400fc0 400fcc = hiihhihihihiiihhhhhi
prob70: 401058 401064 = qtqtohp}}rijjwvr|qr|}nrq
prob71: 4010ed 4010f9 = ?SYRE]CP2UDOH/k46N5J#
prob72: 40114d 401159 = <#lf-7,=H#172t.Yye2)Fl_Vh&
prob73: 400e9f 400eab = Wbov~zqg[IZ}jxwvf}FYR[aY
prob74: 4010c8 4010d4 = cccccccccccccccccccccc
prob75: 401113 40111f = NFPiOYZvKYEW^bgRmBAM
prob76: 400d5e 400d6a = UjJb,U+)**UzF1pj2bx{ls
prob77: 400cfa 400d06 = HNEMpINJzGJHYLnHbYzMqNKO
prob78: 400c81 400c8d = IIIOHONOHOOHIOHOOHOIHI
prob79: 400f51 400f5d = MLOOLLNONNOOMOLNILNNOM
prob80: 4011bb 4011c7 = deba5:Jnv|Eb?4>kBXnRf[L|?I
prob81: 4011b3 4011bf = _XON^]LNO^CLD[[LJZZL]]MFO
prob82: 400d78 400d84 = nhimninlmnmmlonionnmlhloolnh
prob83: 400d6e 400d7a = SYVK]YOGvSCrOCuR_FTQ@qu]w^wX
prob84: 40104d 401059 = GGNDAFAD@D@EODMNGNBOGLFMMO
prob85: 40115b 401167 = 6(1:*2<9=37>.)7788+97/41
prob86: 401180 40118c = 8E3>4/3K2=AKF+-*G91,9/
prob87: 400db1 400dbd = WTRUUTU]RWW_]S]]PRQQV
prob88: 400fb4 400fc0 = LJ@XFL^ETLC_Y@UMZWQ@Z_AYTMZP
prob89: 400f04 400f10 = ckakcocoldcnocaeoejjk
prob90: 400fd4 400fe0 = QTRUQ^QTUUUUQTUTQTQSTSSRP
prob91: 400c1f 400c2b = C@KE@N@FGKDG@AAMCLONN
prob92: 400e93 400e9f = CMISDCN@@G@HIPKBRPP@PPNHC
prob93: 4010fe 40110a = DGDGEFDDGGDDGDFEEEFFEEFG
prob94: 400dbd 400dc9 = vvvvvvvvvvvvvvvvvvvvvvvvvv
prob95: 400e44 400e50 = x]zweUnmcDEFyVbyF|SWlU
prob96: 401295 4012a1 = TTU_U__T[^YUY[_^U[XT^T^__[Z[
prob97: 401132 40113e = 10111010011101110010111101010
prob98: 400e68 400e74 = qtuqtvwtqtvtqpwwttqutvttut
prob99: 400f0b 400f17 = W(,T,*V),(URW-W-UT*,,R+*
prob100: 4010ba 4010c6 = m9-9r9/VA4&8BM=R*+OMrgf
prob101: 400fd2 400fde = ttvwtjivikitiivjvsuisjukthki
cs

 

'CTF' 카테고리의 다른 글

[Codegate 2018] Impel Down  (0) 2018.02.04
[AceBear Security Contest] secure login  (0) 2018.02.02
[Codegate 2017] angrybird  (0) 2018.01.30
[SECCON 2017] JPEG file  (0) 2018.01.20
[Defcon 2016] Baby-re  (0) 2018.01.18