[2021년 3회]
·
정보처리기사
# 1. 다음 C언어에 대한 알맞은 출력값을 쓰시오.[소스코드]#include int main() { int* arr[3]; int a = 12, b = 24, c = 36; arr[0] = &a; arr[1] = &b; arr[2] = &c; printf("%d\n", *arr[1] + **arr + 1);}크기가 3인 포인터 배열 arr 선언정수 a = 12, b = 24, c = 36으로 초기화arr[0] = &a // arr[0]은 a의 주소를 나타냄arr[1] = &b // arr[1]은 b의 주소를 나타냄arr[2] = &c // arr[2]은 c의 주소를 나타냄 arr[0]arr[1]arr[2]arr&a&b&c*arr[1] = 24**arr + 1 → *arr[0] + 1 → 12 + 1 =..
[2021년 2회]
·
정보처리기사
# 1. 다음은 C언어에 관한 소스코드이다. 실행 결괏값을 작성하시오.[소스코드]#include int mp(int base, int exp) { int res = 1; for (int i = 0; i 정수 res 정의res = mp(2, 10);base = 2, exp = 10mp함수 내부의 반복문을 순회하면 2의 거듭제곱을 나타내는 것을 알 수 있는데, i = 9일 때 마지막 참 값이니까2^10 = 1024 [출력결과]1024 # 2. 다음은 C언어 문제이다. 출력값을 작성하시오.[소스코드]#include int main() { int arr[3]; int s = 0; *(arr + 0) = 1; arr[1] = *(arr + 0) + 2; arr[2] = *ar..
[2021년 1회]
·
정보처리기사
# 1. 다음은 C언어 프로그램이다. 실행 결과를 쓰시오.[소스코드]#include struct good { char name[10]; int age;};void main() { struct good s[] = { "Kim", 28, "Lee", 38, "Seo", 50, "Park", 35 }; struct good* p; p = s; p++; printf("%s\n", p->name); printf("%d\n", p->age);}구조체 good을 정의struct good s[ ] = { "Kim", 28, "Lee", 38, "Seo", 50, "Park", 35 };구조체 s의 name과 age에  각각 Kim, 28 / Lee, 38 / Seo, 50 /..
[2020년 4회]
·
정보처리기사
# 1. 다음은 C언어 소스 코드이다. 출력값을 쓰시오.[소스코드]#include void main(){ const char* p = "KOREA"; printf("%s\n", p); printf("%s\n", p + 3); printf("%c\n", *p); printf("%c\n", *(p + 3)); printf("%c\n", *p + 2);}문자열 리터럴 가리키는 포인터 p를 선언 후 포인터가 가리키는 값을 출력하는 문제이다문제를 풀기 전 KOREA 문자열의 인덱스를 보면, K = 0 / O = 1 / R = 2 / E = 3 / A = 4p는 KOREA 문자열 자체를 가리킨다p + 3은 문자열 인덱스 3부터 가리킨다 ==> EA*p는 문자열 배열의 첫 번째 인덱스..
[2020년 3회]
·
정보처리기사
# 1. 다음은 C언어 소스 코드이다. 출력 결과를 쓰시오.[소스코드]#include void main() { int i = 0, c = 0; while (i 정수 i, c를 0으로 초기화반복문 안의 내용을 보니 c = c * i 가 반복되는데, c는 0이므로 반복문을 탈출했을 때 c값은 0[출력결과]0 # 2. 다음은 C언어 소스 코드이다. 출력 결과를 쓰시오.[소스코드]#include int r1() { return 4;}int r10() { return (30 + r1());}int r100() { return (200 + r10());}int main() { printf("%d\n", r100()); return 0;}메인함수의 r100()을 호출r10..
[2020년 2회]
·
정보처리기사
# 1. 다음은 자바 코드이다. 출력 결과를 쓰시오.[소스코드]class A { private int a; public A(int a) { this.a = a; } public void display() { System.out.println("a=" + a); }}class B extends A { public B(int a) { super(a); super.display(); }}public class good { public static void main(String[] args) { B obj = new B(10); }}B 클래스의 obj 객체를 생성 후 B클래..
[2020년 1회]
·
정보처리기사
# 1. 다음은 C언어 소스 코드이다. 출력 결과를 쓰시오.[소스코드]#include void main() { int i, j; int temp; int a[5] = {75, 95, 85, 100, 50}; for (i = 0; i a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (i = 0; i 이 문제는 버블 정렬(Bubble Sort) 알고리즘 문제다코드를 먼저 살펴보면 정수 i, j, temp를 정의하고 크기가 5인 1차원 배열 a를 선언했다반복문을 통해 a[0] ~ a[4] 까지 값을 비교하여 a[j] > a[j+1]을 만족하면 a[j]와 a[j+..
[C++] 이중 포인터
·
Language/C++
#include using namespace std;int main(){ int a = 10; int* Ptr = &a; int** DoublePtr = &Ptr; cout a의 주소값 : 0086FA1Ca의 값 : 10포인터 Ptr의 주소값 : 0086FA10Ptr : 0086FA1C*Ptr : 10이중 포인터 DoublePtr의 주소값 : 0086FA04DoublePtr : 0086FA10*DoublePtr : 0086FA1C**DoublePtr : 10 a의 메모리 주소에 10이라는 값이 저장되어있다 Ptr의 주소는 0086FA10Ptr은 a의 주소값을 담고있다 // int* Ptr = &a;Ptr : 0086FA1C*Ptr은 Ptr이 가리키는 주소(0086FA1C)의 값 10 DoublePtr의 ..
[C++] 포인터
·
Language/C++
#include using namespace std;int main(){ int a = 10; int* p1 = &a; int* p2 = &a; cout a라는 변수에 10 이라는 값을 저장포인터 변수 p1은 a의 주소값을 가리킴포인터 변수 p2은 a의 주소값을 가리킴 &a는 a의 메모리 주소를 뜻함 디버깅을 해보면 &a, p1, p2 모두 동일한 메모리 주소를 출력함0113FB4C0113FB4C0113FB4C하지만 디버깅을 할 때 마다 출력되는 메모리의 주소가 계속해서 바뀌는데, 프로그램을 실행할 때 마다 a라는 변수가 저장되는 메모리의 주소가 계속해서 바뀌기 때문이다
PE File Format
·
Reversing
notepad.exe를 HxD로 열어보자DOS header부터 Section header까지를 PE 헤더, 그 밑의 Section들을 합쳐서 PE 바디라고 한다파일에서는 offset으로, 메모리에서는 VA(Virtual Address)로 표현한다PEview로 열어서 확인해보자파일이 메모리에 로딩되면 모양이 달라지는데, 파일의 내용은 보통 코드(.text), 데이터(.data), 리소스(.rsrc)섹션에 나뉘어서 저장이 된다 PE 헤더의 제일 앞 부분에는 IMAGE_DOS_HEADER 구조체가 존재하는데 크기는 40 이다이 구조체를 자세히 보면 다음과 같다Data에 5A4D라는 리틀 엔디안으로 저장된 값이 보이는데 HxD로 확인해보면 첫번째 이미지의 첫번째 줄에 4D 5A 라는 헥스값이 보이는데, 4D5A..