Pwnable.kr [Toddler's Bottle]의 두번째 문제인 collision입니다.
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;
}
여기서 hashcode == check_password(argv[1]) 이것이 Flag값을 알아내기 위한 핵심 조건문 같은데요.
main()함수의 전달인자를 1개 이상 주어야하는 조건과 argv[]이 20바이트라는 조건과 같이 모두 만족이 되어야
실행이 되는 것 같습니다.
간단하게 해석하자면
Hashcode가 0x21DD09EC로 주어질 때 문자열을 4바이트씩 잘라서 더한 값이 해시코드와 일치해야지 정답을 보여줍니다.
0x21DD09EC - 0X01010101 * 4 =0x1DD095e8
0x1DD095e8이라는 값을 리틀 에디안으로 변환시킨 후 파이썬을 이용하여 exploit 코드를 짜봅시다.
./col `python -c 'print "\x01"*16+"\xe8\x05\xd9\x1d"'`
익스플로잇!
정상적으로 flag가 출력 된것을 확인 할 수 있습니다.
FLAG: daddy! I just managed to create a hash collision :)
'Hacking > [Toddler's Bottle]' 카테고리의 다른 글
Pwnable.kr random 풀이, Write Up :: Archan (0) | 2019.08.29 |
---|---|
Pwnable.kr PassCode 풀이, Write Up :: Archan (0) | 2019.08.28 |
Pwnable.kr Flag 풀이, Write Up :: Archan (0) | 2019.08.26 |
Pwnable.kr Bof 풀이, Write UP :: Archan (0) | 2019.08.26 |
Pwnable.kr FD 풀이, Write Up :: Archan (0) | 2019.08.22 |