본문 바로가기

CTF/Write-up

RC3 CTF GoReverseMe

GoReverseMe.zip

주말이라고 천천히 아주 느긋하게 푼 문제다


실행하면 인자를 안줘서 뜨는 문구 같다

그냥 빈 파일을 하나 만들고 인자로 줘보자


자 실행했더니


바탕화면에 flag.enc라는 파일이 만들어졌다


그냥 랜섬웨어로 암호화한 것처럼 보이는 파일이 나타난다

 

우선 실행을 하면 runtime_text라는 함수가 있는데 헥스레이로 봤을 시

main_step으로 1~4까지 함수가 있다

이 부분을 분석하면 쉽게 풀 수 있을 듯 하다


main_step1을 보면 어떤 값을 가져와 0x69랑 XOR 연산을 한다


위에 루프를 지나서 덤프창을 보니

golang-or-bust라는 값을 볼 수 있다

처음엔 어디에 쓰는지 모르니 일단 알아두기만 하자

main_step1은 더이상 볼일이 없다


이제 main_step2를 봐야하는데

그냥 봐도 너무 길다 천천히 분석해보면 그냥 다 넘어간다

보다 보면

github_com_alexmullins_zip___Writer__Encrypt

이런 함수를 볼 수 있다

zip파일을 암호화할거같은 이름이다


함수로 들어오면 이렇게 또 있다

두개의 함수가 있는데 거치고 나면


이런게 생긴다 zip파일로 보인다

이거 말고는 뭐 별다를게 안보인다

분석능력이 아직 많이 떨어져서 그런거같다

일단 여기까지 짐작해보자면

내가 인자로 파일을 주었을 때 그걸 zip으로 만들어 놓고 

암호화를 했다고 볼 수 있다


다음 main_step3인데 볼게없다 그냥 4로 넘어가자

main_step4를 보면 zip 헤더의 첫번째 바이트와 두번째 바이트를 가져와서

두번째 바이트에서 첫번째 바이트를 빼준다 그리고 그걸 첫번 째 바이트에 저장하는데


처음 바이트 50을 4b에서 빼면 5가된다 저런식으로 파일 바이트만큼 진행한다

딱히 다른 연산은 없는데

이제 기본으로 준 flag.enc를 복호화해보자


이런식으로 뒤에서부터 해준다

처음에 result에 00바이트를 안줘서

압축이 안풀리는 경우가 발생했다 ㅠㅠㅠ

뒤에서부터 앞으로 진행하기때문에 처음에 00바이트를 주고 시작해야한다


1
2
3
4
5
6
7
8
9
10
11
12
13
# golang-or-bust
= open('flag.enc','rb').read()
data = bytearray(f)
result = "\x00"
 
for x in range(len(f)-10-1):
    test = data[x] + data[x-1]
    data[x-1= test&0xff
    result += chr(test&0xff)
 
= open('test.zip','wb')
o.write(result[::-1])
o.close()
cs

이제 소스를 돌려서 얻은 zip파일을 풀어보자

근데 비밀번호가 필요하다

처음에 main_step1에서 얻은 문자열을 비번으로 입력하면된다


RC3-GOLANG-BESTLANG-5435

끝!

'CTF > Write-up' 카테고리의 다른 글

holyshield easylang  (0) 2016.12.19
holyshield StudyScala  (0) 2016.12.19
RC3 2016 CTF FLE  (0) 2016.12.02
f-secure reverse engineering challenge  (0) 2016.07.11
SHARIF CTF DMD android app  (0) 2016.02.08