728x90

 

문제의 압축을 풀면 위와 같이 두가지가 주어진다. 일단 miro저기서 .cer파일을 추출해야된다.

 

 

 

그럼 pcap으로 바꿔주자. 바꾸는 방법은 간단하다. pcap파일이 아닌것같다. 그럼 pcap으로 바꿔주자. 바꾸는 방법은 간단하다.

 

 

와이어샤크로 miro를 열어주고 Save As를 클릭해준다.

 

 

 

저장할때 두번째 pcap을 선택해주고 이름을 바꾸어 저장한다.

 

 

그걸 넣으면 잘 들어가는걸 볼수있다. 이제 저걸 한번 보자. 우클릭해서 폴더열기를 하면 볼수있다.

 

 

인증서를 준다. 저걸 공격해서 풀어보자.

 

 

공개키가 주어져있다. 인증서를 공격하는 가장 완벽한 방법은 저걸 소인수분해 하는 것이다.

 

 

일단 yafu라는 소인수분해 툴을 쓸거라서 중간 공백을 없애주었다. 앞에 30부터 81은 공개키가 아니고 뒤에 02부터 01까지도 공개키가 아니다. 수업시간에 배웠는데 일단 뭔지는 기억이 안난다. 하여튼 그부분을 빼고 중간 공백을 없애주었다.

 

 

yafu를 이용해 흔히 말하는 p랑 q를 구해주었다. 이제 저 p랑 q를 이용하여 개인키를 만들어 주자.

 

from socket import *
from ssl import *
import time

def recv_until(s, string):
    result = ''
    while string not in result:
        result += s.recv(1)
    return result

client_socket=socket(AF_INET, SOCK_STREAM)
tls_client = wrap_socket(client_socket, ssl_version=PROTOCOL_TLSv1_2, cert_reqs=CERT_NONE)

print "[+] Connecting with server.."

tls_client.connect(('ch41l3ng3s.codegate.kr',443))

print "[+] Connect OK"

while 1:
    data = recv_until(tls_client, "Input : ")
    print data
    #message
    user_input = raw_input()

    if user_input == "u":
        tls_client.send("9de133535f4a9fe7de66372047d49865d7cdea654909f63a193842f36038d362\n")
    elif user_input == "d":
        tls_client.send("6423e47152f145ee5bd1c014fc916e1746d66e8f5796606fd85b9b22ad333101\n")
    elif user_input == "r":
        tls_client.send("34660cfdd38bb91960d799d90e89abe49c1978bad73c16c6ce239bc6e3714796\n")
    elif user_input == "l":
        tls_client.send("27692894751dba96ab78121842b9c74b6191fd8c838669a395f65f3db45c03e2\n")
    else:
        print "Invalid input!"
        exit()   

client_socket.shutdown(SHUT_RDWR)
client_socket.close() 

 

그리고 위의 코드를 돌리면 나온다고 한다. 물론 지금은 서버가 닫혀서 확인해볼수는 없었다.

 

 

'ctf write-up > Codegate CTF 2018' 카테고리의 다른 글

BaskinRobins31 - pwn  (0) 2018.02.09
RedVelvet - reversing  (0) 2018.02.09
728x90

이 문제는 pwn중에서 가장 많이 풀린 문제이다. 일단 무슨 파일인지 알아보자.

 

 

보면 또 64비트 ELF파일이다. 그럼 실행시켜보자.

 

 

배스킨라빈스 31게임을 한다. 인터넷에서 필승법을 찾아서 시도했지만 쟤가 반칙을 쓰면서 졌다. 그럼 어쩔수 없이 디버깅을 해야겠다.

 

 

만약 이긴다면 저런 문구를 볼수있다. 일단 힌트가 ROP라고 한다.

 

 

일단 checksec을 통해 보호기법을 확인해보자. NX가 걸려있는걸 봐서는 확실히 힌트가 제대로 된것임을 대충 짐작할 수 있다.

 

 

일단 컴퓨터의 입장에서 your turn에 내가 입력을 넣어준다. 그러니 여기서 분명 오류가 나올것이라고 생각하고 보았다. 이 문제에서는 함수 이름을 바꾸지 않아서 금방 찾을 수 있었다. read함수를 보면 숫자를 입력받는데 문자열로 받고 있다. 그래서 오버플로우가 발생한다.

 

 

 

 

 

 

 

 

 

 

 

'ctf write-up > Codegate CTF 2018' 카테고리의 다른 글

Miro - crypto  (0) 2018.02.09
RedVelvet - reversing  (0) 2018.02.09
728x90

이번 ctf에서 가장 많이 풀린 리버싱 문제이다. 일단 어떤 파일인지 먼저 보자.

 

 

file 명령어를 통해 이 문제는 64비트 ELF파일임을 알았다. 이제 한번 실행을 시켜보자.

 

 

보면 flag를 입력하는곳이 있고 틀린 값이 들어오면 그냥 종료시켜버린다.

 

 

gdb-peda를 통해 종료시키는 함수를 찾았다. 일단 angr를 이용해서 풀것이기 때문에 이 주소를 적어두고 main문을 보자.

 

 

gdb-peda로 보면 0x4012aa에 보이는 func1처럼 밑으로 쭉 내리면 여러 함수들을 거치게 되어있다. 0x401277을 보면 글자수가 26글자인것을 알수있다. 일단 그걸 기억해두고 다시 내려보자.

 

 

여기부분이 일단 가장 괜찮아 보였다. 한번 코딩해보자.

 

 

이렇게 angr를 이용하여 코딩을 해주었다. angr 사용법은 나중에 자세히 포스팅 하겠다. 한번 돌려보자.

 

 

 

돌리면 저렇게 flag값이 나온다. 그런데 저게 인증이 안되었다. 그래서 happiness노래 가사를 찾고 b를 a로 바꾸어서 인증을 하니 성공했다.

 

 

이건 gdb-peda를 이용하여 푼것이고 아이다같은 디버거가 편하면 그걸로 풀어도 상관없다.

 

'ctf write-up > Codegate CTF 2018' 카테고리의 다른 글

Miro - crypto  (0) 2018.02.09
BaskinRobins31 - pwn  (0) 2018.02.09

+ Recent posts