출처는 내 블로그...


여기서 따로 떼어내가져와보았다.


ByteBanditsCTF 2018 전체 writeup



[Crypto]R u Ronald Rivest? 70p



문제이름은 Are you Ronald Rivest?이다. Ronald Rivest가 누구지? 하고 검색해보았다.


RSA 암호 체계를 발명하신 분이다. 왠지 문제와 엄청 관계있을것같다.


이제 문제에서 주어진 파일을 보자.


text.txt 파일과 lol_pub.pem 파일이 주어진다. 

이 pem포맷파일은 문제이름에 나오는 RSA창시자 이름을 볼 때 RSA 공개키파일로 추측된다.

각각을 살펴보면 아래와 같다.


------------------------------------------------------------------------------------------------------------------------

PEM(Privacy-enhanced Electronic Mail)


여기서 준 lol_pub.pem 파일은 이름에서 유추해볼때 public_key파일이라는 것과 파일을 열어봤을때 첫줄과 마지막에 보이는 PUBLIC KEY로 이 파일이 공개키파일임을 알 수 있다.

RSA에서 쓰이는 공개키는 숫자인데, base64로 인코딩된 듯한 문자와 위아래로 텍스트 문자열(-----public ----)이 들어가 있다.

이러한 형태를 띄고 있는 파일은 PEM(Privacy Enhanced Mail) 포맷 파일로, 공개키를 암호화한 파일이다.


openssl을 이용해 개인키 및 공개키를 생성하면 위와 같은 파일을 자주 볼 수 있다.



비교해보기 위해 임의로 mykey.pem을 생성해보았다.


같은 형식인 걸 알 수 있었다.


그럼 openssl로 분석해볼까.. -noout -text 옵션으로 PEM 인코딩된 인증서를 파싱해서 정보를 출력해보겟다.



n = 225bit이고 e=65537인것을 알 수 있다. 

n을 좀 더 숫자로 표현해서 보고 싶다면 방법이 있다. ( https://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key )


PUBKEY=`grep -v -- ----- lol_pub.pem | tr -d '\n'`  
echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i  


환경변수로 문자열을 파싱하고 base64 디코딩해 openssl을 통해 정보를 읽는다.



n이랑 e가 BIT STRING, offset 17에 들어있ㄷ. -strparse을 추가해서 파싱해주자.



n=0x013269DC2680BC64277889DC6A101ED6F13DD07498F13A4818474C2069

(32269109513264378873151120068074444086989044741418671122338798116969)

e=0x10001 (65537)


n을 찾았다!!


이제 소인수 분해를 하면 되겠다. 이 때 좋은 사이트가 있다는 것을 알았다.


FatorDB : http://factordb.com/    


이 사이트에 넣으면 만약 DB에 이미 소인수분해한 값이 있다면 그대로 알려준다. 매우 좋은 사이트다...!!



오옹... 감사합니다...


p,q = 1796360473659570891671495336244551, 17963604736595708916714953362445519


이제 p,q를 구했으니 개인키 d를 구하면 되겠다. 이 때 좋은 툴 rsatool 이 있다. 이걸 활용하자.

아 그놈의 gmpy... 다른 서버로 가야겠다.



n =

13269dc2680bc64277889dc6a101ed6f13dd07498f13a4818474c2069


e = 65537 (0x10001)


d = 24628356329157132106384879910356205355957782278135706168828095323773

(0xe9dc37c53f2e09f6c21dde172931a8e35ec454f10fb39c15a38f5e7d)


p = 1796360473659570891671495336244551 (0x589141bcf7bfd38312fcb363b547)


q = 17963604736595708916714953362445519 (0x375ac9161ad7e431ebddf01e514cf)


구할건 다 구했다.


text.txt에 있는 값들이 base64인코딩되있으니 디코딩해주자.


echo "AGRPJtAkcHxM5h9RiMMECc9KdKeXRuVvP5XlgsI=" | base64 -d | openssl rsautl -keyform PEM -inkey private.pem -decrypt

echo "AAqhlINL/9sBf80jq9qgdHO+yXR1O0zyljGDzCo=" | base64 -d | openssl rsautl -keyform PEM -inkey private.pem -decrypt

echo "AIV/vkErNAGt0j37090nxhiwwQyjtXcDugLTKDE=" | base64 -d | openssl rsautl -keyform PEM -inkey private.pem -decrypt


뭐가 출력되는지 보자



좀 엉망이지만... 순서를 조금 정리해보자.


flag{u  

_n00b}

n0_10ng3r


flag{un0_10ng3r_n00b} 인것 같다... 굿!

'Write-up > Crypto' 카테고리의 다른 글

[Plaid CTF 2018] macsh - 125  (0) 2018.05.07
[0ctf 2017] integrity - 75p  (0) 2018.05.02
[UIUCTF 2018] xoracle (250)  (0) 2018.04.18
[TyokoWesterns] My Simple Cipher[75]  (0) 2017.09.02
[anstromCTF 2017] Knock Knock  (0) 2017.04.25

+ Recent posts