목록Write-up (52)
또 뭐하지
풀이 문제 웹 페이지에 접속하면 위와 같이 나온다. 제공된 코드를 살펴보면 admin으로 로그인했을 때 flag가 출력되는 것을 알 수 있다. 코드 마지막 부분을 살펴보면 /change_password를 통해 패스워드를 바꿔 admin으로 로그인을 할 수 있을 것 같다. flag 페이지에 를 입력해주었다. 그리고 방금 변경한 패스워드 1234를 입력해서 로그인을 하면, 아래와 같이 flag가 나온 것을 볼 수 있다.
풀이 base64 인코딩은 바이너리를 6자리씩 끊어서 총 2**6 = 64개의 문자로 표현하는 것이다. 주어진 힌트에서는 문자가 총 2**5 =32개이므로 바이너리를 5자리씩 끊어서 문자로 인코딩했다고 추측해볼 수 있다. 즉 base32 인코딩을 한 것이다. dreamhack tool에서 From Base32를 이용할 것이다. 문제에서 힌트가 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef 라고 주어졌기 때문에 Alphabet을 'A-Za-f='로 설정하고 돌려보면 flag 값을 얻을 수 있다.
풀이 문제 코드를 살펴보니 지난 번에 풀었던 session-basic과 비슷하다. 그 차이를 살펴보니 admin의 session_id을 생성할 때 os.urandom(4).hex()가 아닌 os.urandom(1).hex()를 사용하고 있다. 그 차이가 무엇인지 파이썬을 돌려보니 숫자가 byte 크기를 나타내고 있었다. 그렇다면 admin의 session_id는 작은 범위 내에서 랜덤하게 돌아가니 brute-force를 해야겠다고 생각했다. [버프스위트 설치] Burp Suite (버프 스위트) - 1. 설치 및 사용 방법 1. Burp Suite (버프 스위트) 대표적인 웹 애플리케이션 보안 테스트 도구로 스캐닝을 포함하여 다양한 유형의 보안 테스트 수행이 가능합니다. 주요 기능 중 하나는 웹 브라우저..
풀이 문제 코드를 살펴보면 쿠키의 sessionid를 통해 username을 받아온다. userid가 admin일 때 flag를 얻을 수 있다. 이때, 어떻게하면 admin의 sessionid를 얻을 수 있을지 알아야한다. 코드의 해당 부분을 살펴보면 서비스를 실행하면 admin의 sessionid가 생성되어 session_storage에 저장되는 것을 알 수 있다. session_strage는 별도의 검증없이 /admin페이지에 접속하면 열람할 수 있다는 사실 또한 알 수 있다. 문제 페이지에 접속하여 /admin페이지에 접속해보면 위와 같이 admin의 sessionid를 알 수 있다. 개발자도구를 통해 빈칸에 sessionid를 만들고 그 값으로 아까 확인한 값을 넣어준다. 그리고 새로고침을 하면 ..
풀이 문제 코드를 살펴보면 username이 'admin' 일 때 flag가 출력되는 것을 알 수 있다. username은 쿠키를 통해서 받아온 값을 그대로 사용하는 것을 확인할 수 있다. 그렇다면 쿠키를 수정하여 admin을 username으로 입력하면 flag를 얻을 수 있다. 코드에서 살펴본 users에 저장된 guest로 로그인을 했다. 그러면 개발자도구의 Application 탭에 새로 생성된 쿠키를 확인할 수 있다. 이 쿠키의 값을 guest 에서 admin으로 수정하고 새로고침을 하면 아래와 같이 플래그가 출력되는 것을 볼 수 있다.
PEM Public Key Infrastructure Enhanced Mail X.509 디지털 인증서와 키를 저장하고 전송하기 위한 표준 형식 텍스트 형식으로 인코딩되어 있으며, 보통 .pem 확장자를 가짐 일반적으로는 인증서, 개인 키, 공개 키 등의 암호학적 자격 증명 요소를 포함 RSA 비대칭 키 암호화 방식 (공개 키 - 데이터 암호화 / 개인 키 - 데이터 복호화)소인수분해의 어려움에 기반 Key Generation 1. 큰 소수 2개 p와 q를 선택2. n 계산 : n = p*q3. 오일러 파이 함수 계산 : ϕ(n) = (p-1) * (q-1) 4. ϕ(n)과 서로소인 정수 e 선택 5. e의 역원을 계산하여 d를 구함 : e * d ≡ 1 (mod ϕ(n)) → 공개키 (n,e) / 개인..
풀이 제공된 파일에는 chall1.c 파일과 chall1 바이너리 파일이 있다. chall1.c의 코드를 보면 적절한 비밀번호를 입력을 하면 복호화가 되는 것을 알 수 있다. 위 코드를 보면 입력된 비밀번호와 KEY를 XOR한 값을 JOKER와 대조하여 일치하면 올바른 비밀번호로 인식되는 것을 알 수 있다. 따라서 JOKER와 KEY를 XOR 연산하여 원하는 비밀번호 값을 얻을 수 있다는 것을 알 수 있다. (∵ a = b^c 이면 a^b = c) jocker = "\x40\x53\x06\x03\x43\x52\x54\x3b" key = "023661dd4" tmp = "" for i in range(8): tmp += chr(ord(key[i])^ord(jocker[i])) print(tmp) 위와 같은..
풀이 제공된 파일에는 DyingMessage 파일이 들어있다. filepath = "D:/dreamhack/SingleByteXor/DyingMessage" with open(filepath, 'r') as f: Msg = f.read() def XOR(msg, i): l = len(msg) p = "" for j in range(0,l-2,2): tmp = int('0x'+msg[j:j+2],16)^i p = p+chr(tmp) return p for i in range(0,256): print("i = ", i, " ", XOR(Msg, i)) 단일 바이트와 XOR 했다는 힌트가 문제에 제공되어있다. 이를 바탕으로 다잉메시지를 바이트 단위로 떼어서 브루트포스 공격을 시행하는 코드를 작성하였다. 실행결..