주말이라고 천천히 아주 느긋하게 푼 문제다
실행하면 인자를 안줘서 뜨는 문구 같다
그냥 빈 파일을 하나 만들고 인자로 줘보자
자 실행했더니
바탕화면에 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 f = open('flag.enc','rb').read() data = bytearray(f) result = "\x00" for x in range(len(f)-1, 0, -1): test = data[x] + data[x-1] data[x-1] = test&0xff result += chr(test&0xff) o = 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 |