Story of CowHacker

Pwnable_collision 본문

공부/Pwnable

Pwnable_collision

Cow_Hacker 2019. 11. 24. 02:50
728x90

포너블 2번 문제를 풀어볼거다.

 

2번 문제사진이다.

해석을 대충 해봤다. 아들이 아빠한테 MD5 충돌에 대해 들었다. 나도 하고싶다??

( 아버지 대단하신거 같다. MD5도 아시고;; )

번역기를 돌려 봤다.

 

 

 

 

2번 문제 번역한 사진이다.

대충 맞게 해석 한거 같았다.

MD5 해시 충돌이 뭔지 구글링 해봤다.

 

 

 

 

MD5 구글링한 사진이다.

서로 다른 두 개의 입력값에 대해 동일한 출력값을 내는 상황을 해시 충돌이라고 나와있다.

이 정보를 알고난 후 문제에 있는 shh로 접속을 해봤다.

 

 

 

 

2번 ssh로 접속한 화면이다.

역시나 제작자의 나름 디자인한 pwnablee.kr이 보였다.

password는 guest를 입력하고 들어갔다.

 

 

 

 

 

ls명령어를 입력한 사진이다.

들어간후 일단 뭐가 있는지 ls를 쳐보니 col, col.c flag 가 있었다.

1번 문제인 fd와 똑같은 구조의 파일이였다.

 

 

 

 

col을 cat으로 열어본 사진이다.

호기심에 col을 cat으로 열어 보았다. ㅎㅎ 역시나 외계어 그 와중에 %s 라고 문자열을 받는 듯한 코드가 보였다.

아마 무엇을 입력받으면 flag를 보여주고 또는 틀렸다고 하는거 같았다. 그리고 그 문자열은 20바이트가 되야 한다는 

것도 추측할 만했다.

 

 

 

 

이번엔 실행 시켜봤다.

passcode 를 입력하라는 문구가 나왔다. 역시나 argv 형식으로 뭘 입력해야 하는구나 했다.

 

 

 

 

col.c를 cat으로 열어본 사진이다.

이번엔 col.c 파일을 열어 봤다.

음...일단 쭉쭉 아는대로 해석을 해봤다.

검증 되지 않은 긴 해시코드 = 0x21DD09EC라고 있었고 그 바로 밑에는 check_password라고 i값에 5번을 중첩해 값이

나오게 하는 듯한 코딩이였다.

main 부분을 봤다.

첫번째 if 문은 argc값이 2보다 작으면 아까 내가 봤던 옆에 뭘 입력하라는 듯한 문구가 뜨도록 코딩 되있었다.

두번째 if 문은 그 옆에 입력한 값이 20이 아니면 20 바이트로 해야 한다는 문구가 뜨도록 코딩 되있었다.

세번째 if 문은 hashcode 와 check_password값이 같으면 flag를 출력 하라는 문구가 뜨도록 코딩 되있었다.

그리고 아니면 패스코드가 틀렸다라는 문구가 뜨도록 코딩되있었다.

 

흠... 그래서 결론은 hashcode 와 check_password 값이 같아야만이 flag를 볼수 있다는 말이였다.

 

 

 

 

해시코드를 입력한 사진이다.

일단 무턱대고 해시코드를 그대로 복사해서 적어봤다. 20바이트를 채우라는 문구가 나왔다.

 

 

 

 

20바이트를 채운 사진이다.

이번에는 그 해시코드뒤에 문구를 더 추가해 20바이트를 만들어 봤다.

이번엔 패스코드가 틀렸다고 떳다.

 

 

 

 

해시코드 사진이다.

도대체 저게 뭘까 하고 봤다.

 

 

 

 

채크페스워드 사진이다.

그리고 이 부분에서 5번 중첩으로 채크패스워드에 입력된다는 걸 봤다. 

flag 출력조건 사진이다.

어떻게든 저기 해시코드 값을 채크패스워드에 넣어야만 flag를 얻는구나 싶었다. 5번 중첩.... 5로 나워야 하나.... 그래서 일단 해시코드를 5로 나눠봤다.

 

 

 

 

해시값을 게산기에 올린 사진이다.

 

나는 일단 그냥 윈도우 10에 있는 계산기를 켜서 해시값 그대로 복사후 계산기에 붙혀넣기 했다.

dec값이 568,134,124인걸 보았다. 이제 5로 나눠 보았다.

 

 

해시값을 나누기 5한 값이다.

나누기 해보니 dec 값은 113,626,824였다. 끝자리 4... 4곱하기 5는 20 이다. 그럼 끝자리가 0이 되는데 해시값의 dec는 끝자리가 4이다..허허...4가 나머지로 갔구만,.....싶었다.

 

 

 

 

나누기한 값에 곱하기 5한 값이다.

역시나 역시나,,,, 4가 모자란 값인 568,134,120이였다. 문과인 내겐 어찌 하나 어찌하나 했다.

일단은 4까지만 곱하고 나머지 모자란 건 그냥 나누기한 그 값 ( 해시값 / 5 한 값 ) 에 더하기 4를 한 뒤 합치면 될꺼 같았다.

 

 

 

 

나누기한 값에 곱하기 4를 한 사진이다.

일단 곱하기 4를 했다.

 

 

 

 

나누기한 값에 더하기 4를 한 사진이다.

그리고 더하기 4만 한 값이다.

 

 

 

 

다시 합친 사진이다.

합쳐보니 처음 해시 값이 나왔다! ㅎㅎ~

 

이제 이걸 그대로 입력 해보려 했는데....어....그럼 그냥 처음 내가 한거랑 뭐가 다르나...싶었다.ㅠㅜㅠㅜ

 

일단 제목에 MD5 해시 충돌 다른 값을 입력했는데 같은 값이 나오는 현상....해서..어...음...허...허..ㅠㅜㅠㅜㅜㅠ

 

 

 

 

 

 

채크페스워드 코딩 사진이다.

다시 와서 봤다. int 4바이트씩 5번 입력! 그냥 해시값을 나누기 하고 더하기 하는 식 자체를 넣는 것이다 왜냐면 그것이 해시 값을 5번 나눈 값이기 때문이다. 

 

 

식을 입력한 사진이다.

그런데 그대로 입력을 하니 풀리지 않았다.

구글링을 해보니 main 함수에서는 인자를 문자열 형태로 받기 때문에 내가 적은 저 값은 아스키 코드로 들어 간다는 사실도 알게 되었다.

그래서 쓰는 것이 바로 백틱 ` 라고 했다. 백틱 사이에 들어간 모든 값은 main 함수 전에 쉘에 의해 실행이 된다는 것이였다.

 

 

 

 

 

근데 그렇게 백틱을 썻는데도 풀리지 않았다.

또 구글링을 해봤다.

백틱이 그래도 쉘에 넘어가니 쉘에 넘어갈시 실행할 언어를 넣어 줘야 한다는 사실을 또 알게 되었다.

그래서 나는 파이썬으로 언어를 선택해 넣어 줬다.

 

 

 

파이썬을 적용해 넣은 값 사진이다.

파이썬적용해 넣은 값또한 오류가 났다. ㅜㅜ

 

또 구글링 해보았다.

 

바이트는 리틀엔디안, 빅엔디안,미들엔디안 이렇게 세가지로 받아 들인다는 사실을 알게 되었다.

나는 그래서 리틀엔디안 방식으로 다시 값을 줬다.

왜냐면 내 컴퓨터는 인텔CPU라 리틀엔디안 방식을 사용하기 때문이다.

flag값 사진이다.

728x90

'공부 > Pwnable' 카테고리의 다른 글

Pwnable_Random  (2) 2020.07.24
Pwnable_Passcode  (0) 2019.12.16
Pwnable_Flag  (0) 2019.11.30
Pwnable_Bof  (0) 2019.11.29
Pwnable_fd  (0) 2019.11.20
Comments