목록분류 전체보기 (126)
SH1R0_HACKER
id : darkknight password : new attacker [bugbear.c] /* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include #include main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 40byte의 buffer 변수를 생성했고 argv[..
첫 번째 예시입니다. // stack-1.c #include #include int main(void) { char buf[16]; gets(buf); printf("%s", buf); } 위 코드를 볼 때 gets() 함수에 별도의 길이 제한이 없기 때문에 16바이트를 넘는 데이터를 입력한다면 스택 버퍼 오버플로우가 발생합니다. 버퍼에 16byte만큼 A를 입력하고 추가로 BBBBCCCC를 입력하자, SFP가 0x42424242로, RET가 0x43434343로 바뀐 모습을 볼 수 있습니다. 이와 같이 스택 버퍼 오버플로우는 프로그램이 스택에 위치한 버퍼에 할당된 것보다 더 많은 데이터를 쓸 때 발생합니다. 버퍼 오버 플로우 취약점은 길이 제한이 없는 API 함수들을 사용하거나 버퍼의 크기보다 입력받는..
los.rubiya.kr/ Lord of SQLInjection los.rubiya.kr
#include int main() { int a = 10, b = 20; int* ptr = &a; *ptr = 30; ptr = &b; *ptr = 50; printf("a : %d\n", a); printf("b : %d\n", b); printf("*ptr : %d\n", *ptr); } 각 변수의 주소값이 아래와 같을 때 위 코드를 실행시켰을 경우 출력될 값을 적어보세요. a의 주소값 : 100 b의 주소값 : 200 ptr의 주소값 : 300 [ 출력 값 ] a : b : *ptr : #include int main() { int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; printf("arr : %d\n", arr); for (int i = 3; i < 5..
// 포인터 정리(5) // 포인터 배열 #include void example1() { int arr[3] = { 1, 2, 3 }; int(*ptr_arr)[3] = &arr; // 배열 포인터 선언 int* ptr[3] = { &arr[0], &arr[1], &arr[2] }; // 포인터 배열 선언 for (int i = 0; i < 3; i++) { // 배열 출력 printf("arr[%d] = %d\n",i, arr[i]); } printf("\n"); for (int i = 0; i < 3; i++) { // 배열 포인터 출력 printf("(*ptr_arr)[%d] = %d\n",i, (*ptr_arr)[i]); } printf("\n"); for (int i = 0; i < 3; i++..
// 포인터 정리(4) // 2차원 배열과 배열 포인터 #include void example1() { int arr[2][3] = { {1, 2, 3}, {4, 5, 6} }; printf("sizeof(arr) = %d\n", sizeof(arr)); // 24 printf("sizeof(arr[0]) = %d\n", sizeof(arr[0])); // 12 printf("sizeof(arr[0][0] = %d\n\n", sizeof(arr[0][0])); // 4 // &arr = &arr[0] = &arr[0][0] printf("&arr = %d\n", &arr); printf("&arr[0] = %d\n", &arr[0]); printf("&arr[0][0] = %d\n", &arr[0][0]..
// 포인터 정리(3) // 배열 포인터 #include void example1(); void example2(); void example3(); int main() { printf("예제 1번\n"); example1(); printf("\n"); printf("예제 2번\n"); example2(); printf("\n"); printf("예제 3번\n"); example3(); printf("\n"); } void example1() { int arr[5] = { 11, 22, 33, 44, 55 }; int* ptr = arr; // &arr[0] = arr = ptr printf("&arr[0] = %d\n", &arr[0]); printf("arr = %d\n", arr); printf("p..
#include int main() { int a[5] = { 2, 4, 6, 8, 10 }; int* ptr = &a; for (int i = 0; i < 5; i++) { printf("%d ", *ptr[i]); } } 위의 코드를 실행하려 했더니 오류가 발생한다. 어디가 잘못되었는지 확인하고 수정해보자. #include int main() { int a[5] = { 2, 4, 6, 8, 10 }; int *ptr_a = a; printf("for문 출력 : "); for (int *ptr = a; ptr < a + 5; ptr++) { printf("%d ", *ptr); } printf("\n\n"); printf("*ptr_a + 3 = %d\n", *ptr_a + 3); printf("*(p..
// 포인터 정리(2) // 배열과 포인터와의 관계 #include void example1(); void example2(); void example3(); int main() { printf("예제 1번\n"); example1(); printf("\n"); printf("에제 2번\n"); example2(); printf("\n"); printf("에제 3번\n"); example3(); printf("\n"); } void example1() { int a = 10; int* ptr = &a; printf("&a = %d\n", &a); printf("ptr = %d\n", ptr); printf("ptr+1 = %d\n", ptr + 1); // int형 크기만큼 증가 (4byte) } voi..