[- Disclaimer -]
아래 내용은 정보보안 공부 목적으로 작성된 것이나, 이를 토대로 허가되지 않은 대상에 실습을 진행할 경우 해킹 시도로 간주하여 법적 처벌을 받을 수 있음을 알려 드립니다.
strcmp()
✦ <string.h>
✦ NULL String을 만날 때까지 str1 <-> str2 간 동일한 문자 위치 상에서 ASCII Code 비교
✦ Parameter1에 전달되는 Argument1
✧ 문자열1 주소
✦ Parameter2에 전달되는 Argument2
✧ 문자열2 주소
✦ Return 값
✧ str1 < str2 시 1 이하
✧ str1 == str2 시 0
✧ str1 > str2 시 1 이상
✦ BOF 취약 함수
✧ 문자열 길이 미검증
→ 할당된 공간을 넘어서도 문자열 길이를 검증하지 않아 계속 비교가 가능하며 이 경우 Error가 날 수도 안 날 수도 있음
int strcmp(const char *str1, const char *str2);
Plain Text
복사
Ex)
#include <stdio.h>
#include <string.h>
int main(void){
char buf[10] = "abc";
char *string = "abc";
int result = 0;
result = strcmp(buf, string);
printf("result : %d \n", result);
return 0;
}
Plain Text
복사
result: 0
--------------------------------
Process exited after 0.4099 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
Plain Text
복사
#include <stdio.h>
#include <string.h>
int main(void){
char buf[10] = "aac";
char *string = "abc";
int result = 0;
result = strcmp(buf, string);
printf("result: %d \n", result);
return 0;
}
Plain Text
복사
#include <stdio.h>
#include <string.h>
int main(void){
char buf[10] = "aac";
char *string = "abc";
int result = 0;
result = strcmp(buf, string);
printf("result: %d \n", result);
return 0;
}
Plain Text
복사
result: -1
--------------------------------
Process exited after 0.4494 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
Plain Text
복사
#include <stdio.h>
#include <string.h>
int main(void){
char buf[10] = "abc";
char *string = "aba";
int result = 0;
result = strcmp(buf, string);
printf("result: %d \n", result);
return 0;
}
Plain Text
복사
result: 1
--------------------------------
Process exited after 0.2357 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
Plain Text
복사
#include <stdio.h>
#include <string.h>
int main(void){
char buf[10] = "aapsemiordoenus";
char *string = "aapsemiordoenus";
int result = 0;
if(strcmp(buf, string))
printf("참일 경우 실행");
else
printf("거짓일 경우 실행");
return 0;
}
Plain Text
복사
#include <stdio.h>
#include <string.h>
int main(void){
char buf[10] = "aapsemiordoenus";
char *string = "aapsemiordoenus";
int result = 0;
if(strcmp(buf, string))
printf("참일 경우 실행");
else
printf("거짓일 경우 실행");
return 0;
}
Plain Text
복사
strcmp() 기능 구현 - Ex)
#include <stdio.h>
int self_strcmp(const char *str1, const char *str2);
int main(void){
char buf[10] = "bzzzzz";
char *string = "c";
int result = 0;
result = self_strcmp(buf, string);
printf("result: %d \n", result);
return 0;
}
int self_strcmp(const char *str1, const char *str2) {
size_t i = 0;
int result = 0;
while((str1[i] == str2[i]) && ((str1[i] != '\0') && (str2[i] != '\0')))
i++;
if(str1[i] > str2[i])
result = 1;
else if(str1[i] < str2[i])
result = -1;
return result;
}
Plain Text
복사
result: -1
--------------------------------
Process exited after 0.2552 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
Plain Text
복사
최적화된 strcmp() 기능 구현
✦ 단, 최적화 구현이지만 이 경우 Return 값이 1이나 -1이 아닌 양수, 음수로 반환
✧ 물론, 필요한 경우 조건을 추가해 -1, 1이 반환되게 할 수는 있음
→ Ex) sub < 0 ? return -1 : return 1;
#include <stdio.h>
int self_strcmp(const char *str1, const char *str2);
int main(void) {
char buf[10] = "c";
char *string = "c";
int result = 0;
result = self_strcmp(buf, string);
printf("result: %d \n", result);
return 0;
}
int self_strcmp(const char *str1, const char *str2) {
size_t i = 0;
int sub = 0;
while((str1[i] == str2[i]) && ((str1[i] != '\0') && (str2[i] != '\0')))
i++;
sub = str1[i] - str2[i]; //str1이 크면 양수, str1이 작으면 음수
return sub;
}
Plain Text
복사
result: 0
--------------------------------
Process exited after 0.2125 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
Plain Text
복사



