□ 문제 코드는 아래와 같다.
□ 본 문제를 해결하기 위해 3가지를 해결해야한다.
- argv 인자 2개 이상
- argv[1]의 길이가 20
- Check_password 함수의 return 값이 hashcode(=0x21DD09EC)와 같아야한다.
□ 아래의 Check_password() 함수를 자세히 봐보면 인자로 const char* p형 즉, 문자열을 입력 받아와서 (int *)형으로 타입 변환 후 int형 포인터인 ip에 데이터를 넣어준다.
- 만약 인자를 "abcdefgh"(= 8바이트)를 입력했다면 const char* p형을 (int*) 형으로 변환되므로 ip 포인터에서 ip[0]은 "abcd" 데이터를 가리키고 ip[1]은 "efgh"를 가리킨다.
- 이 때, 당연히 "abcd"와 "efgh"는 char 형이므로 int형으로 저장된다.
- 그 다음에 for문으로 ip배열에 있는 값들을 모두 합한 값을 unsigned long형으로 반환한다.
□ 본 문제를 해결하기 위해서는 ip[0] + ip[1] + ip[2] + ip[3] + ip[4] 값이 "0x21DD09EC"여야한다.
□ 즉, "0x21DD09EC"를 다섯개로 나누면 된다.다섯개 로 나누면 "0x06C5CEC8" * 4 + "0x6C5CECC"가 된다.
□ 따라서 아래와 같이 "0x06C5CEC8" * 4 + "0x6C5CECC" 20글자로 만든다음 인자에 전달하면 문제가 풀리게 된다.
'■ Wargame > - Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] flag - 7 pt ( Write Up ) (0) | 2019.06.10 |
---|---|
[Pwnable.kr] BoF - 5 pt ( Write Up ) (0) | 2019.06.09 |
[Pwnable.kr] Fd - 1pt (Write up) (0) | 2019.06.09 |