R136A1

[SWING] pwnable.kr collision 본문

SWING/[21-1] SYSTEM

[SWING] pwnable.kr collision

r136a1x27 2021. 5. 5. 22:40

ssh를 통해 서버에 접속한 뒤

ssh col@pwnable.kr -p2222 (pw: guest)
ls 를 쳐보면 flag 파일과 col 파일 보임

flag에 접근하려 보면 permission denied
col 파일 실행시키면 인자를 전달하라고 함
아무거나 치면 20글자 이상

col.c파일을 vim으로 열어서 코드 살펴보기

#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;
}


hashcode = 0x21DD09EC
if(hashcode == check_password(argv[1]))
    system("/bin/cat flag");
인자로 들어온 값을 check_password 함수에 돌린 값이 hashcode와 일치하면 플래그를 출력함

check_password

char* → int * (char 문자열 데이터를 int 정수 데이터로 변경) 포인터 변환

만약 11111222223333344444 를 넣었다면 char 데이터는 index로 [0]~[20]까지 존재한다 (마지막 null)

이걸 4byte인 int 로 변환하게 되면 index로 [0]~[5]까지 존재하게 된다

[0] 1111 [1] 1222 [2] 2233 [3] 3334 [4] 4444 [5] null

 

for: int res에 ip[0] ~ ip[4] 까지 차례대로 더한다 (즉, 입력할 값은 숫자 데이터)

1111+1222+2233+3334+4444=12344

 

즉, 0x21DD09EC 가 되도록 하려면

(나누어떨어질 경우) □*5

(나누어떨어지지 않을 경우) □*5+△    (데이터는 20자리만 넣을수 있으므로 △는 마지막 index에 + 해서 넣는다)

 

계산기에서 21DD09EC % 5 해서 △먼저 찾고, 그것 뺀 값을 ÷ 5

06C5 CEC8

06C5 CEC8

06C5 CEC8

06C5 CEC8

06C5 CECC

를 넣으면 풀릴 것이다.

 

주의할 점은, linux에서 hex값을 넣으려면 little endian 방식으로 넣어줘야 하므로

C8CEC506*4+CCCEC506


파이썬 스크립트(print)를 사용하여 넣으면 확실하게 인자를 전달할 수 있다.

./col `python -c 'print "\xC8\xCE\xC5\x06"*4 + "\xCC\xCE\xC5\x06"'`

flag: daddy! I just managed to create a hash collision :)

Comments