![[pwnable.kr] collision 표지](/covers/naver/naver-222123483004-1.webp)
![[pwnable.kr] collision 이미지 2](/images/naver/naver-222123483004-2.webp)
SSH프로토콜을 이용하기 위해서 PuTTY를 이용한다.
![[pwnable.kr] collision 이미지 3](/images/naver/naver-222123483004-3.webp)
위와 같은 창이 나온다.
![[pwnable.kr] collision 이미지 4](/images/naver/naver-222123483004-4.webp)
디렉토리 파일 목록을 확인하는 명령어 ls를 사용하니
이전의 문제 fd와 같이 세개의 파일이 디렉토리에 존재한다.
역시 col은 알 수 없는 문자들로 구성되어있고, col.c는 C언어로 작성되어있다.
(파일을 읽는 명령어 cat 사용)
1 #include <stdio.h>
2 #include <string.h>
3 unsigned long hashcode = 0x21DD09EC;
4 unsigned long check_password(const char* p){
5 int* ip = (int*)p;
6 int i;
7 int res=0;
8 for(i=0; i<5; i++){
9 res += ip[i];
10 }
11 return res;
12 }
13 int main(int argc, char* argv[]){
14 if(argc<2){
15 printf("usage : %s [passcode]\n", argv[0]);
16 return 0;
17 }
18 if(strlen(argv[1]) != 20){
19 printf("passcode length should be 20 bytes\n");
20 return 0;
21 }
22 if(hashcode == check_password( argv[1] )){
23 system("/bin/cat flag");
24 return 0;
25 }
26 else
27 printf("wrong passcode.\n");
28 return 0;
29 }
(오우 코드 길고;)
먼저 코드를 훑어봤다.
대충 암호를 입력하여 플래그를 알아내는 코드인 것 같다.
19~22번 코드에 의해 암호는 20자리여야 한다.
4번의 check_password 함수를 보면 받은 문자열을 4바이트씩 잘라 모두 더하는 것을 볼 수 있다.
(int형 변수의 포인터를 증가시키므로 4바이트)
즉 어떤 문자열을 입력했을때, 5번에 걸쳐 나눠서 더했을때 해시코드가 되어야한다.
![[pwnable.kr] collision 이미지 5](/images/naver/naver-222123483004-5.webp)
계산기를 이용해 해시코드를 10진수로 바꾸면 568134124라는 값을 얻을 수 있다.
딱 봐도 5로는 나누어지지 않을 것이기에 4를 빼놓고 5로 나눈 뒤, 하나의 값에 4를 더해주면 되겠다는 생각이 들었다.
위와 같은 계산 결과가 나왔으므로
6C5CEC8을 4번 6C5CECC를 1번 입력해 주는 방식으로 하기로 했다.
![[pwnable.kr] collision 이미지 6](/images/naver/naver-222123483004-6.webp)
이와 같이 입력했으나, 암호의 길이가 20바이트가 아니라는 문구가 나온다.
입력 방법에 문제가 있는 것 같아 다른 라이트업을 찾아봤다.
![[pwnable.kr] collision 이미지 7](/images/naver/naver-222123483004-7.webp)
위와 같은 방식으로 파이썬을 이용하면 플래그를 얻을 수 있다.
위 사진을 볼때 16진수의 값들이 순서가 이상한 것을 볼 수 있는데, 이는 리틀 엔디안(little endian)기법을 사용했기 때문이다.
![[pwnable.kr] collision 이미지 8](/images/naver/naver-222123483004-8.webp)
문제 해결 과정에서 마무리가 확실하지 못했다.
질문 1. 리틀 엔디안 기법이 적용되는 때는 언제인가?
질문 2. 파이썬을 사용하지 않으면 풀 수 없는 문제인가?
* 파이썬 사용한 문장 이해하기