본문 바로가기
pwnable.kr/[Toddler's Bottle]

[pwnable.kr Toddler's Bottle] collision - write up

by 안다니. 2020. 3. 25.
반응형

Proble

문제 화면
ssh 접속 화면

이번 문제를 보면, 해시코드의 충돌에 관한 내용인가? 라고 생각하고 MD5 즉 MD5는 128비트 암호화 해시 함수이다. 이런 걸 먼저 생각하고 col.c 를 열어보았다.

반응형

 

hashcode와, check_password가 같으면 문제가 해결 되는 것으로 보인다. 그렇다면, hashcode와 check_password 함수를 살펴보자

총 5번의 반복이 돌아가고, 사용자가 입력한 20바이트를 4바이트 단위로 5번 읽어들인다고 생각하면 될 것 같다.

그 값이 res에 저장이 되고, 값이 같으면 해결이 되는데, 그렇다면 hashcode 값을 5번 나눠보자 그럼 0x6C5CEC8이 나온다. 확인을 위해 이 값이 다시 5를 곱해본다.

  0x21DD09E8 0x21DD09EC 로 값이 서로 다르다.

그렇다면 0x6C5CEC8를 4번 넣어주고, 마지막 한번은 4를 더한 0x6C5CECC를 넣어주면 해결이 가능 할 것으로 보인다.

Solved

빅 엔디언 & 리틀엔디언

  빅 엔디언은 소프트웨어의 디버그를 편하게 해 주는 경향이 있다. 사람이 숫자를 읽고 쓰는 방법과 같기 때문에 디버깅 과정에서 메모리의 값을 보기 편한데, 예를 들어 0x59654148은 빅 엔디언으로 59 65 41 48로 표현된다.

  반대로 리틀 엔디언은 메모리에 저장된 값의 하위 바이트들만 사용할 때 별도의 계산이 필요 없다는 장점이 있다. 예를 들어, 32비트 숫자인 0x2A는 리틀 엔디언으로 표현하면 2A 00 00 00이 되는데, 이 표현에서 앞의 두 바이트 또는 한 바이트만 떼어 내면 하위 16비트 또는 8비트를 바로 얻을 수 있다. 반면 32비트 빅 엔디언 환경에서는 하위 16비트나 8비트 값을 얻기 위해서는 변수 주소에 2바이트 또는 3바이트를 더해야 한다. 보통 변수의 첫 바이트를 그 변수의 주소로 삼기 때문에 이런 성질은 종종 프로그래밍을 편하게 하는 반면, 리틀 엔디언 환경의 프로그래머가 빅 엔디언 환경에서 종종 실수를 일으키는 한 이유이기도 하다. -출처 위키백과

반응형

댓글