White Security
Collision 문제풀이 본문
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 계정이 주어졌네요.
#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 로 채워 넣었습니다.
>>> hex ( 0x21DD09EC - ( 0x01010101 * 4 ) ) '0x1dd905e8'
목표값인 0x21DD09EC에서
0x01010101 * 4 을 빼면
0x1DD905E8 이 됩니다.
인텔 cpu에서는 변수를
리틀 엔디안으로 저장해야 합니다.
따라서 역순인 E8 05 D9 1D 로
첫번째 변수를 작성하면 되겠군요.
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 :)
작성한 것을 바이트 형식 인자로 전달해주면
플래그를 얻을 수 있었습니다.
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 |
Comments