2번째 문제에서부터 약간 길을 잃어서 벙쪘다ㅋㅋ
결론적으로 말하면 내가 너무 어렵게 생각해서 길을 잃었던 거고 다른 사람의 풀이를 한번 보고나니 뭐야 할만하네라는 생각이 들었지만 그래도 풀이를 작성해보기로 했다.
접속해서 col.c 파일부터 확인해보자
문제에 MD5 hash collision 얘기를 하길래 어? MD5는 32길이 코드인데 hashcode값은 8자리인거지? 입력 문자열은 왜 20개만 입력하는 거지? 의문을 품으며 MD5에 대해서 열심히 구글링 해봤는데 결국 못찾고 다른사람의 풀이를 참고했다.
https://0xrick.github.io/pwn/collision/
pwnable.kr - collision
My write-up for collision from pwnable.kr.
0xrick.github.io
이사람은 엄청 상세하게 풀이를 적고 디버깅 툴을 사용해서 그 과정까지 자세한 설명을 써놓아서 참고하는데 편했다.
결론적으로 이문제는 MD5 hash collision을 사용하는게 아니고 비슷한 과정으로 hashcode를 풀어낼 수 있는지에 관한 문제였다.
check_password() 함수는 문자열 포인터 p를 받아서 이를 정수형 포인터 ip에 저장하는데 이는 정수형 하나가 4byte 크기이기 때문에 총 20byte의 문자열이 4byte씩 나누어져 저장됨을 뜻한다.
그래서 5번의 for문 반복을 통해 나누어진 5개 정수형을 더해서 hashcode를 생성한다.
0x21DD09EC 라는 hashcode가 하드코딩 되어있기 때문에 이를 계산해내기위한 16진수 계산이 필요하다
0x21DD09EC는 10진수로 568,134,124 이고, 이를 5로 나누면 나누어떨어지지 않기 때문에 5로 나눈 몫
113,626,824 * 4 + (113,626,824 + 4) 으로 문자열을 구성해주면 된다.
이를 16진수 코드로 변환하면 06C5 CEC8 * 4 + 06C5 CECC 이다.
Little Endian에 유의하여 입력 문자열을 작성하면
\xc8 \xce \xc5 \x06 *4 + \xcc \xce \xc5 \x06 이 되고
./col `python -c 'print "\xc8\xce\xc5\x06" * 4 + "\xcc\xce\xc5\x06"'`
명령어를 사용해 플래그를 얻는데 성공했다.
'IT(개발, 보안) > pwnable' 카테고리의 다른 글
[Pwnable 풀이] 6. flag (0) | 2022.11.19 |
---|---|
[Pwnable 풀이] 5. cmd1 (0) | 2022.11.15 |
[Pwnable 풀이] 4. shellshock (0) | 2022.11.10 |
[Pwnable 풀이] 3. coin1 (0) | 2022.11.09 |
[Pwnable 풀이] 1. fd (0) | 2022.11.09 |