White Security
Collision 문제풀이 본문
1 2 3 4 | Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnable.kr -p2222 (pw:guest) |
Toddler's Bottle 2번 문제입니다.
이전 문제와 마찬가지로 ssh 계정이 주어졌네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #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; } |
접속하면 소스코드가 주어지는데요.
프로그램 실행 인자를
int 포인터로 캐스팅하여
20 바이트, 즉 int 변수 5개를 더하여
0x21DD09EC가 되면 플래그를 출력하도록 되어 있습니다.
먼저 입력이 20바이트로 제한되어 있기에
20바이트의 공간을 마련했습니다.
NUL은 입력으로 사용할 수 없기에
int 하나를 제외하고는
모두 0x01010101 로 채워 넣었습니다.
1 2 | >>> hex ( 0x21DD09EC - ( 0x01010101 * 4 ) ) '0x1dd905e8' |
목표값인 0x21DD09EC에서
0x01010101 * 4 을 빼면
0x1DD905E8 이 됩니다.
인텔 cpu에서는 변수를
리틀 엔디안으로 저장해야 합니다.
따라서 역순인 E8 05 D9 1D 로
첫번째 변수를 작성하면 되겠군요.
1 2 | col@ubuntu:~$ . /col $ '\xE8\x05\xD9\x1D\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01' daddy! I just managed to create a hash collision :) |
작성한 것을 바이트 형식 인자로 전달해주면
플래그를 얻을 수 있었습니다.
1 | echo -en '\xE8\x05\xD9\x1D\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01' | xargs . /col |
echo와 xargs를 이용해서 인자를 전달하는 방법도 있습니다.
'Wargame Writeups > pwnable.kr' 카테고리의 다른 글
Random 문제풀이 (0) | 2019.02.06 |
---|---|
Passcode 문제풀이 (0) | 2019.02.06 |
Flag 문제풀이 (0) | 2019.02.05 |
Bof 문제풀이 (0) | 2019.02.05 |
Fd 문제풀이 (0) | 2019.01.31 |