본문 바로가기
시스템 해킹/pwnable.kr

[Pwnable.kr] collision

by L3m0n S0ju 2021. 4. 19.

 

 


 

문제: 아빠가 오늘 MD5 해쉬 충돌에 대해서 알려줬어. 나도 하고 싶어!


 

 

문제에서 주어진 포트에 ssh로 접속하면 3개의 파일이 주어진다. flag 파일은 권한이 없어 읽을 수 없고 col은 실행권한이 있다.

 


 

col 실행파일은 setuid가 설정되어있어 일반 사용자가 col 안에서 col_own의 권한을 가지므로 flag를 출력할 수 있는 권한이 있다.

 


 

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
    int* ip = (int*)p;
    int i;
    int res=0;
    for(i=0; i<5; i++){
        res += ip[i];
    }
    return res;
}

int main(int argc, char* argv[]){
    if(argc<2){
        printf("usage : %s [passcode]\n", argv[0]);
        return 0;
    }
    if(strlen(argv[1]) != 20){
        printf("passcode length should be 20 bytes\n");
        return 0;
    }

    if(hashcode == check_password( argv[1] )){
        system("/bin/cat flag");
        return 0;
    }
    else
        printf("wrong passcode.\n");
        return 0;

}

 


 

위 코드는 col.c 코드이다. 플래그를 출력하기 위한 첫 번째 조건으로 hashcode와 check_password( argv[1] )이 같으면 플래그를 출력한다. 두 번째 조건은 입력한 문자열이 총 20바이트어야한다. check_password 함수에서 입력한 문자열에서 int형을 5번 읽어와서 총합을 반환한다. int 형은 4바이트이므로 20바이트를 5로 나누면 딱 들어맞는다.

 

전역변수 hashcode = 0x21DD09EC를 5개로 나누면 되므로 계산하면 0x06c5cec8을 4번 0x06c5cecc를 1번을 바이트 형식으로 입력하면 플래그를 출력한다.

 

 

 

./col `python -c 'print b"\xc8\xce\xc5\x06"*4+b"\xcc\xce\xc5\x06"'`

 

 

위 익스플로잇 코드를 입력하면 ``안에 있는 문자열들은 명령어로 해석되고 결과가 대신 들어가게 된다. 안의 명령어는 python -c 명령어를 이용해 파이썬 문법으로 ''안에 있는 문자열들은 명령어로 해석되고 결과가 대신 들어가게 된다. 따라서 20바이트가 입력되고 플래그가 출력된다.

 


플래그

'시스템 해킹 > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] cmd1  (0) 2021.04.21
[Pwnable.kr] mistake  (0) 2021.04.21
[Pwnable.kr] flag  (0) 2021.04.19
[Pwnable.kr] bof  (0) 2021.03.24
[Pwnable.kr] fd  (0) 2021.03.24

댓글