CTFLearn Easy Writeup

skyepodium·2020년 10월 12일
1

CTFLearn 에서 Easy 난이도만 모아서 Writeup 작성

1. Basic Injection

SQL Injection 을 시도해 달라는 뉘앙스를 강하게 준다.

페이지 소스를 보았을때 힌트가 나오가 Luke 를 입력했을때 데이터가 나온다.

submit 버튼을 누르면 POST 메소드로 input 변수에 담아 서버에 요청한다.

변수가 한개, 문제의 난이도를 보았을때 sql은 다음과 같을 것으로 예상된다.

select * from user where input = 'input'

input 변수를 조작해서 모든 데이터가 나오게하는 방법은
' or 'a' = 'a 를 입력해서 where의 조건이 모두 true가 되게 하는 것이다.

select * from user where input = '' or 'a' = 'a'

2. Forensics 101

사진이 주어졌을때 나의 과정
1) binwalk 로 파일 시그니처 검사
2) online decoder, meta 검사
3) 헥스 에디터 열기
4) 기타 등등

아무것도 안걸려서, 에디터로 열고 문자열 검색하니 나왔다.

3. Taking LS


압축을 풀면 PDF 한개말고 없다. 문제의 이름이 힌트이고, ls -al 명령어를 통해 숨겨져있는 폴더를 살펴본다.

4. Where Can My Robot Go?

사실 비슷한 문제를 봤다.

난이도는 낮은데 난데없이 로봇타령하면 robots.txt를 살펴본다.

robots.txt는 웹 페이지의 정보를 수집하는 로봇(크롤링 봇)에게 허용 여부를 알려주는 파일이다.

위치는 메인도메인/robots.txt 에 보통 위치시킨다.(보통 메인으로 들어오니까)

5. Binwalk

파일마다 시그니처가 존재하고, binwalk는 알아서 그 특징을 찾아서 어떤 파일이 숨겨져있는지 밝혀준다.

참고로 PNG의 시그니처는
89 50 4E 47 0D 0A 1A 0A

jpeg 파일에 png파일이 숨어 있음을 알 수 있었고, -D 옵션을 통해 추출했다.

binwalk 설치 깃허브
저는 binwalk 설치하는데 맥의 homebrew 이용했습니다.

6. Character Encoding

7D 이렇게 되어있는거 보니까 16진수 느낌이온다.

구글에 hex to text 검색하면 conver 사이트가 나온다.

7. Practice Flag

워밍업이나까 패스

8. Reversal of fortune

문제 제목은 행운의 반전이란 뜻인데, 뒤집으라는 것이 힌트다
(사실, rot1~13 다 해보고 현타올때 txeN 보고 감이 왔다. 뒤집자)

간다한 사칙연산 할때 브라우저 콘솔창 열고 계산하는것처럼,

문자열 뒤집고 싶을때 터미널 열고 파이써닉하게

a = ".nac uoy fi tIe$reveRpilF eldnah ym gnisu em egassem ,avaj yllacificeps ,gnidoc emos htiw pleh deen I ,deifitnedi tegrat txeN"

# 뒤집자
a[::-1]

문제에서 해커 이름을 찾으라고 했는데 handle의 의미는 직함이라는 의미다. 그래서, FlipRever$eIt 가 정답

9. Hextroadinary

개인적으로는 어려웠다.

힌트는 ROXy 로 XOR 연산을 진행한다.

XOR calulator

그리고, 이 문제만 유독 정답 형태가 다르다. 0x붙여서 CTFLearn 없이 입력한다.

10. Wikipedia

이 문제를 보면서 노력과 정성이 대단하다고 느꼈다. 무려 2015년 부터 5년을 준비했다.

위키 피디아 가서 128.125.52.138 검색한다.

diff 누르면,

11. Simple Programming

readlines 사용하면 줄바꿈해서 리스트로 반환한다.

f = open("./data.dat", 'r')
lines = f.readlines()

cnt = 0
for line in lines:
    zero_cnt = 0
    one_cnt = 0

    for i in line:
        if i == '0':
            zero_cnt += 1
        elif i == '1':
            one_cnt += 1

    if zero_cnt % 3 == 0 or one_cnt % 2 == 0:
        cnt += 1
f.close()

print(cnt)

파이썬 문자열 특징 몰랐는데 for loop 순회하니까 개행 문자도 들어온다.
else: 했다가 계산 틀렸다. elif로 적었다.

12. Base 2 2 the 6

1) type
Cryptography

2) content
There are so many different ways of encoding and decoding information nowadays... One of them will work! Q1RGe0ZsYWdneVdhZ2d5UmFnZ3l9

3) writeup
딱히 감 오는게 없으면 이것저것 다 해보면 되기는 하는데 사이버 쉐프 에 입력하면 다음과 같이 알맞는 decode 방법을 추천해준다.

정답:CTF{FlaggyWaggyRaggy}

13. BruXOR

1) type
Cryptography

2) content
There is a technique called bruteforce. Message: q{vpln'bH_varHuebcrqxetrHOXEj No key! Just brute .. brute .. brute ... :D

3) writeup
사이버 쉐프 에서 XOR Bruteforce decoder 를 이용했다.

정답: CTFLearn{y0u_Have_bruteforce_XOR}

14. QR Code

1) type
Miscellaneous

2) content
Do you remember something known as QR Code? Simple. Here for you :
https://mega.nz/#!eGYlFa5Z!8mbiqg3kosk93qJCP-DBxIilHH2rf7iIVY-kpwyrx-0

3) writeup

qr code reader로 읽으면 text가 나온다.

= 심볼을 보았을때 base64로 인코딩 되었다는 흔적이고, base64로 디코딩 하면, a0_obql_s0etrg_de_pbqr 이 된다.

이것저것 다해봐서 결과는

15. Reverse Polarity

1) type

Cryptography

2) content

I got a new hard drive just to hold my flag, but I'm afraid that it rotted. What do I do? The only thing I could get off of it was this: 01000011010101000100011001111011010000100110100101110100010111110100011001101100011010010111000001110000011010010110111001111101

3) writeup

이진수를 텍스트로 표현하는 원리는 다음과 같다.

  1. char 문자형 데이터는 고유의 숫자값을 가지고 있다.
  2. 그리고 1byte는 8bit. 8bit는 0~2^7-1(127 까지 표현이 가능하다.)

1, 2번 2개를 조합하면 다음이 가능하다.

8자리 이진수 -> 10진수 -> 문자

예시)
01000101 -> 69 -> E

# 이진수 10진수로 변환하기
def binary_to_decimal(binary):
    result = 0
    base = 0

    # 뒤에서 부터 돌면서 2씩 올려준다.
    for i in range(7, -1, -1):
        result += (ord(binary[i]) - 48) * 2 ** base
        base += 1
    return result


binary_text = input()

# 1. 입력받은 이진수를 공백으로 분리해서 리스트로 만들기
binary_list = binary_text.split(" ")


# 2. 만약 리스트를 만들었는데 리스트의 길익 1이고, binary_text의 길이가 8보다 길다면 분리가 안된것으로 본다.
if len(binary_list) == 1 and len(binary_text) > 8:
    temp = ""
    for i in range(1, len(binary_text) + 1):
        temp += binary_text[i-1]
        if i % 8 == 0 and i != len(binary_text):
            temp += " "
    print("8자리로 분리된 이진수: {0}".format(temp))

    # 공백으로 분리해서 리스트 만들기
    binary_text = temp
    binary_list = binary_text.split(" ")


# 3. 8bit 이진수를 십지수로 바꾸기
decimal_list = []
for i in binary_list:
    decimal_list.append(binary_to_decimal(i))

print('10진수 리스트 {0}'.format(decimal_list))


# 4. 10진수를 문자 바꾸기로
result = ""
for i in decimal_list:
    result += chr(i)

print("최종 문자열: ", result)

CTF 대회 참가할때는 코드 짜기 보다는 서비스 이용하자 잘 되어 있다.
convertbinary 여기 좋다. 광고가 조금 많은게 안좋다. ㅋ

profile
callmeskye

1개의 댓글

comment-user-thumbnail
2021년 12월 21일

바이너리에서 텍스트로의 변환용. 다음 도구도 살펴보십시오.
바이너리 번역의 경우
https://dnschecker.org/binary-to-text-translator.php

답글 달기