tmxklab
[pwnable.kr] collison 본문
1. 문제 확인
col.c파일부터 확인해보자
[ 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 = 0x21dd09ec이며 check_password(argv[1])의 리턴 값이 같으면 flag값이 출력된다.
2. 접근 방법
check_password를 자세히 살펴보자
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;
}
파라미터 p의 데이터 타입은 char형(1byte)이지만 ip로 강제형변환할 떄 ip의 데이터 타입은 int형(4byte)이다. 따라서 만약에 "11112222~~"으로 입력했으면 ip[0]는 "1111"이다. 그리고 아스키코드표 값에 따라 최종적으로
ip[0] = 825,307,441(0x31313131)이다.
이 점을 유의해서 20byte값의 합이 0x21dd09ec(hashcode)로 만들면 된다.
3. 문제 풀이
0x21dd09ec / 5 = 0x06c5cec8 인데 나머지가 4임
따라서 0x06c5cec9 * 4 + 0x06c5cec8을 파라미터로 주면 될듯
4. 몰랐던 개념
'War Game > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] random (0) | 2020.11.20 |
---|---|
[pwnable.kr] passcode (0) | 2020.11.20 |
[pwnable.kr] flag (0) | 2020.11.20 |
[pwnable.kr] bof (0) | 2020.11.20 |
[pwnable.kr] fd (0) | 2020.11.20 |
Comments