ssh col@pwnable.kr -p2222 (pw:guest) 으로 접속합니다.
col@ubuntu:~$ ls -l
total 16
-r-sr-x--- 1 col_pwn col 7341 Jun 11 2014 col
-rw-r--r-- 1 root root 555 Jun 12 2014 col.c
-r--r----- 1 col_pwn col_pwn 52 Jun 11 2014 flag
col.c를 보겠습니다.
col@ubuntu:~$ cat col.c
#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;
}
먼저 main함수를 보면, argv[1]의 길이가 20바이트이어야 함을 알 수 있습니다.
hashcode == check_password( argv[1] ) 이면 flag를 얻을 수 있네요.
check_password()가 하는 일을 봅시다.
20바이트 입력값을 4바이트씩 쪼개서 5개를 모두 더합니다.
만약 입력값이 \x11112222333344445555 이라면 \x1111+\x2222+\x3333+\x4444+\x5555 = res 가 되는겁니다.
col@ubuntu:~$ ./col `python -c 'print "\x01\x01\x01\x01"*4+"\xE8\x05\xD9\x1D"'`
daddy! I just managed to create a hash collision :)
'WAR GAME > Pwnable.kr' 카테고리의 다른 글
pwnable.kr [random] 풀이 (0) | 2018.02.26 |
---|---|
pwnable.kr [passcode] 풀이 (0) | 2018.02.26 |
pwnable.kr [flag] 풀이 (0) | 2018.02.26 |
pwnable.kr [bof] 풀이 (1) | 2018.02.26 |
pwnable.kr [fd] 풀이 (0) | 2018.02.25 |