[pwnable.kr] collision

이 글의 목차25개
  1. SSH프로토콜을 이용하기 위해서 PuTTY를 이용한다.
  2. 위와 같은 창이 나온다.
  3. 디렉토리 파일 목록을 확인하는 명령어 ls를 사용하니
  4. 이전의 문제 fd와 같이 세개의 파일이 디렉토리에 존재한다.
  5. 역시 col은 알 수 없는 문자들로 구성되어있고, col.c는 C언어로 작성되어있다.
  6. (파일을 읽는 명령어 cat 사용)
  7. (오우 코드 길고;)
  8. 먼저 코드를 훑어봤다.
  9. 대충 암호를 입력하여 플래그를 알아내는 코드인 것 같다.
  10. 19~22번 코드에 의해 암호는 20자리여야 한다.
  11. 4번의 check_password 함수를 보면 받은 문자열을 4바이트씩 잘라 모두 더하는 것을 볼 수 있다.
  12. (int형 변수의 포인터를 증가시키므로 4바이트)
  13. 즉 어떤 문자열을 입력했을때, 5번에 걸쳐 나눠서 더했을때 해시코드가 되어야한다.
  14. 계산기를 이용해 해시코드를 10진수로 바꾸면 568134124라는 값을 얻을 수 있다.
  15. 딱 봐도 5로는 나누어지지 않을 것이기에 4를 빼놓고 5로 나눈 뒤, 하나의 값에 4를 더해주면 되겠다는 생각이 들었다.
  16. 위와 같은 계산 결과가 나왔으므로
  17. 6C5CEC8을 4번 6C5CECC를 1번 입력해 주는 방식으로 하기로 했다.
  18. 이와 같이 입력했으나, 암호의 길이가 20바이트가 아니라는 문구가 나온다.
  19. 입력 방법에 문제가 있는 것 같아 다른 라이트업을 찾아봤다.
  20. 위와 같은 방식으로 파이썬을 이용하면 플래그를 얻을 수 있다.
  21. 위 사진을 볼때 16진수의 값들이 순서가 이상한 것을 볼 수 있는데, 이는 리틀 엔디안(little endian)기법을 사용했기 때문이다.
  22. 문제 해결 과정에서 마무리가 확실하지 못했다.
  23. 질문 1. 리틀 엔디안 기법이 적용되는 때는 언제인가?
  24. 질문 2. 파이썬을 사용하지 않으면 풀 수 없는 문제인가?
  25. * 파이썬 사용한 문장 이해하기

[pwnable.kr] collision 표지

[pwnable.kr] collision 이미지 2

SSH프로토콜을 이용하기 위해서 PuTTY를 이용한다.

[pwnable.kr] collision 이미지 3

위와 같은 창이 나온다.

[pwnable.kr] collision 이미지 4

디렉토리 파일 목록을 확인하는 명령어 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

계산기를 이용해 해시코드를 10진수로 바꾸면 568134124라는 값을 얻을 수 있다.

딱 봐도 5로는 나누어지지 않을 것이기에 4를 빼놓고 5로 나눈 뒤, 하나의 값에 4를 더해주면 되겠다는 생각이 들었다.

위와 같은 계산 결과가 나왔으므로

6C5CEC8을 4번 6C5CECC를 1번 입력해 주는 방식으로 하기로 했다.

[pwnable.kr] collision 이미지 6

이와 같이 입력했으나, 암호의 길이가 20바이트가 아니라는 문구가 나온다.

입력 방법에 문제가 있는 것 같아 다른 라이트업을 찾아봤다.

[pwnable.kr] collision 이미지 7

위와 같은 방식으로 파이썬을 이용하면 플래그를 얻을 수 있다.

위 사진을 볼때 16진수의 값들이 순서가 이상한 것을 볼 수 있는데, 이는 리틀 엔디안(little endian)기법을 사용했기 때문이다.

[pwnable.kr] collision 이미지 8

문제 해결 과정에서 마무리가 확실하지 못했다.


질문 1. 리틀 엔디안 기법이 적용되는 때는 언제인가?

질문 2. 파이썬을 사용하지 않으면 풀 수 없는 문제인가?

* 파이썬 사용한 문장 이해하기


전체 글 보기