[문제]
[풀이]
보호기법 분석
- 32bits 바이너리
- 카나리 존재
- NX bits 존재
- PIE 없음
소스코드 분석 - 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는 전역 변수로 선언되어 있음
- passcode가 hashcode와 같다면 flag를 출력함
- passcode는 20byte이어야 함
- passcode는 argv[1]로 전달할 것
문제 해결
💡 0x21DD09EC을 20byte로 넣을 수 있는 방법을 찾자!
→ 5로 나누면 나머지가 발생하므로 이를 이용하면 늘릴 수 있음
→ 113626824(6C5CEC8)*4+113626828(6C5CECC)을 10진수로 넣으면 byte 초과함
→ 16진수 형태로 넣으면 됨!
"\xc8\xce\xc5\x06"*4+"\xcc\xce\xc5\x06”
flag
🍒 daddy! I just managed to create a hash collision :)
'Wargame > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] random (0) | 2022.10.14 |
---|---|
[Pwnable.kr] passcode (0) | 2022.10.14 |
[Pwnable.kr] flag (0) | 2022.10.14 |
[Pwnable.kr] bof (0) | 2022.10.14 |
[Pwnable.kr] fd (0) | 2022.10.14 |