본문 바로가기

Pwnable/pwnable.kr

[pwnable.kr] collision 풀이

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr


 

Collision의 문제이다.

이전 문제와 같이 kali를 통해 ssh로 접속하였다.

 

접속한 후에 ls -l 명령어를 통해 파일과 권한을 확인하였다.

Flag 파일을 열어야 하는 것 같은데, permission denied로 열리지 않는다.

 

col파일을 실행시켰더니 [passcode]를 입력하라고 하고, 뒤에 아무 문자나 입력해보니 passcode의 길이가 20바이트 여야 한다고 한다.

 

 

얻을 수 있는게 없으니, col파일의 c코드인 col.c를 cat 명령어를 통해 열어보았다.

 

col.c

 

코드를 차례대로 보면, 맨 위에서 hashcode = 0x21dd09ec 라는 값이 지정되어 있다.

 

그리고 맨 아래의 메인함수를 확인해보니

 input이 없을 때는 “usage : [passcode]”가 출력되게 되어 있고,

input의 길이가 20바이트가 아니면 “passcode length should be 20 bytes”가 출력되도록 하고 있다.

 

마지막 if 문을 보면 우리가 찾아야 하는 flag파일을 보여주게 되어있는데, 그 조건은 위에 있던 hashcode와 check_password(argv [1])이 같아야 한다고 한다.

 

 

Hashcode 값은 정해져있으니 check_password 함수의 동작 방식을 확인해보았다.

 

Input에 대하여 int형으로 저장한 후, res 변수에 4byte씩 5번 가져와서 저장하는 것을 알 수 있다.

 

정리하자면, hashcode에 저장된 0x21dd09ec라는 값이 5번에 나뉘어서 입력되어야 flag가 출력될 것이라고 예측할 수 있다.

 

 따라서 일단 0x21dd09ec를 5로 나누어보면 0x6c65cec8*5 에 나머지는 4가 나온다.

즉, 이 식을 다섯번으로 나누면

0x21dd09ec = 0x6c65cec8*4 + (0x6c65cec8+4)로 표현할 수 있다.

 

이를 little-endian 방식을 이용하여 python코드를 통해 인자로 넘겨주면 될 것 같다고 생각했고,

직접 입력해보면 아래의 그림과 같이 flag 파일이 보여지고 있는 것을 알 수 있다.

 

'Pwnable > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] lotto 풀이  (0) 2021.08.18
[pwnable.kr] mistake 풀이  (0) 2021.07.29
[pwnable.kr] leg 풀이  (0) 2021.07.29
[pwnable.kr] random 풀이  (0) 2021.07.29
[pwnable.kr] fd 풀이  (0) 2021.07.11