1 overflow_example.c
(1) 소스코드
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one");
strcpy(buffer_two, "two");
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two,buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one,buffer_one);
printf("[BEFORE] value is at %p and is %d (0x%08x)\n", &value, value, value);
printf("\n[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]);
printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two,buffer_two);
printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one,buffer_one);
printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value);
}
- gcc로 컴파일하고 gdb 들어가기
- 18번째 줄에 Break걸고 run 123456789
- buffer_one, buffer_two 의 주소 확인
- buffer_two에 overflow가 발생해 buffer_one의 값이 잘못된 것을 알 수 있음
(2) Buffer_two Overflow
- 18번째 줄에 Break 걸고 A 29개 run
- Buffer_two에 의해 one까지 오버플로우가 일어난 것을 확인할 수 있음
2 Bufferoverflow 예제 1-1
(1) puts 함수의 메모리상의 주소 작성하시오
(2) welcome 문자열의 메모리상의 주소를 작성하시오. > x/10c $edx로 확인한 주소값
(3) return 0; 에 break를 걸고 실행한 후의, esp의 값을 작성하시오.
> 값은 포인터 주소 그 자체, 값이 가리키는 내용은 0x74
2 Bufferoverflow 예제 1-2
(1) 변수 a,b의 스택상의 주소를 작성하시오.
>x/x는 스텍 내에서 확인하는 방법, print도 같은 결과를 출력함
(2) 배열 buf의 스택상의 주소를 작성하시오.
(3) 배열 buf의 7번째와 11번째 원소의 값을 각각 작성하시오.
> 앞선 문제에서 확인한 buf의 주소가 x/16x $esp에 포함됨
3 auth_overflow.c
- 소스코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[16];
strcpy(password_buffer, password);
if(strcmp(password_buffer, "brillig") == 0)
auth_flag = 1;
if(strcmp(password_buffer, "outgrabe") == 0)
auth_flag = 1;
return auth_flag;
}
int main(int argc, char *argv[]) {
if(argc < 2) {
printf("Usage: %s <password>\n", argv[0]);
exit(0);
}
if(check_authentication(argv[1])) {
printf("\n-------------------------\n");
printf(" ACCESS GRANTED.\n");
printf("---------------------------\n");
}
else {
printf("\nAccess Denied.\n");
}
}
- Break 거는 부분 확인하고 걸기
- A *17 으로 run해서 1byte overflow 일어나게 함
- auth_flag와 password_buffer의 값 확인하기
> auth_flag의 값이 00000000이여야 하나 오버플로우로 인해 더이상 0이 아님
- 비밀번호를 틀렸지만 countinue하면 권한 있는 것으로 처리함