본문 바로가기

CTF

ASIS CTF Final 2017 Write up (ABC Reversing challenge)

ASIS CTF Final 2017 write up 

ABC Reversing Challenge


ASIS CTF에 나왔던 ABC라는 리버스 엔지니어링 문제입니다. 

문제 파일:   https://github.com/Gyeongje/CTF/blob/master/ASIS%20CTF%20Finals%202017/ABC/abc_b96c97d1229d3275cc9ee51f6b2b3d7c5be36446



처음에 문제를 열고 헤더를 보면 XZ 파일인걸 알수있습니다

XZ 확장자로 변경 후 파일을 꺼내 보면



ELF 파일 같은데 헤더가 이상해보입니다. 밑으로 내려보니 역시나 ELF 파일 헤더가 보입니다.



파일 data를 자르고 elf 파일로 변환 후 실행시켜보았습니다.



argv 인자를 통해 연산을 진행하는거 같습니다.
IDA로 열어보았습니다.


메인함수 모습입니다. 

처음에 s, nptr, dest 변수에 4바이트씩 할당해줍니다.

후에 인자에 넣었던 값을 argv[1]를 통해 1~4번째 값은 s에  4~9번째 값은 dest에 9~12번째 값은 nptr에 넣어줍니다.

그 다음 sub_4024DF 함수를 통해 굉장히 복잡해보이는 연산이 진행됩니다. 

sub_4024DF를 거친 값은 흡사 hash 암호화를 떠오르게 하는데 이 암호화는

SHA1 Encryption과 동일하였습니다


flag를 결정해주는 if문 조건은 
s값과 s를 SHA1 암호화한 1~4번째 해쉬값과 동일해야 하며
nptr 값과 nptr를 SHA1 암호화한 1~4번째 해쉬값과 동일해야 합니다.
그 다음조건으로 s의 정수값 보다 nptr의 정수값이 더 커야합니다.

일단 첫번째로 s 와 nptr 값을 구하기 위해 파이썬으로 간단히 코딩하였습니다.

 
1
2
3
4
5
6
7
8
9
10
11
12
import hashlib
 
= 0
for i in range(2):
    for j in range(c, 65535):
        h = "%04x" % j
        sha = hashlib.sha1(h).hexdigest()
        if sha[0:4== h:
            print "str%d = " % (i + 1+ h
            c = j + 1
            break
#57d9 b53a



s = 57d9    nptr = b53a

위 조건 3개를 만족하는 값이 나왔습니다.


마지막으로 남은 조건 변수 dest를 SHA1 암호화한 hash 값이 "69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9" 가 되어야합니다.

이부분도 파이썬으로 brute force 해주었습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import hashlib
 
= '69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9'
bf_table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$^*():_-<>?{}"
 
for a in bf_table:
    for b in bf_table:
        for c in bf_table:
            for d in bf_table:
                sha = hashlib.sha1('9' + a + b + c + d + 'b').hexdigest()
                if sha == s:
                    print '9' + a + b + c + d + 'b'
                    exit(1)
# 9:-*)b
 
cs


(dest 배열은 6자리라 s의 4번째 배열값('9')과 nptr의 9번째 배열값('b')과 겹칩니다)

그렇게 나온 결과값은 9:-*)b 입니다.

이제 이 인자값들을 합쳐서 하나로 나타낸다면 57d9:-*)b53a 가 됩니다.



저 같은 경우에는 인자에 )에 들어가니 위와 같이 token ')' 오류가 떴습니다. 

그래서 앞에 역슬래쉬('\') 를 붙여 ./abc 57d9:-*\)b53a 을 써주었더니 성공적으로 문제가 풀렸습니다.

 


'CTF' 카테고리의 다른 글

제 12회 정보보호올림피아드 본선후기  (20) 2017.10.30
제 12회 정보보호올림피아드 예선풀이  (2) 2017.10.30
YISF 2017 본선 풀이(x)  (0) 2017.09.18
YISF 2017 write up  (0) 2017.08.09
DIMICTF 2017 write up  (0) 2017.07.16