Menu
-
열혈 C++ 프로그래밍 (Chapter01 문제풀이)Language/C 2023. 8. 13. 22:01
//실행 예 1번째 정수 입력 : 1 2번째 정수 입력 : 2 3번째 정수 입력 : 3 4번째 정수 입력 : 4 5번째 정수 입력 : 5 합계 : 15 #include int main(void) { int result = 0; int a; std::cout > a; int b; std::cout > b; int c; std::cout > c; int d; std::cout > d; int e; std::cout > e; result = a + b + c + d + e; std::cout
-
C 재귀호출 (하노이탑)Language/C 2023. 7. 30. 22:57
탑을 다른 탑으로 옮기는 하노이탑이다. 규칙은 제일 위에 있는 원판을 움직여야하며 한번에 한개씩 이동이 가능하고, 크기가 작은 원판은 큰 원판위로 가지 못한다. 옮기는 과정들을 생략하고 전체적으로 봤을때 원판이 n개가 있으면 가장 큰 원판을 제외하고 그 위의 n-1개의 원판을 옮긴 후, 가장 큰 원판을 목적지에 옮기고, 다시 n-1개의 원판을 목적지에 크기순으로 놓으면 된다. 간단한가 하면서도 코드로 짜면서 생각을 하니 좀 어지러웠다. #include void hanoi(int n, char start, char work, char end){ if(n == 1){ printf("%d을 %c에서 %c로 옮김", n, start, end); } else{ hanoi(n-1, start, end, work);..
-
리버싱 핵심 원리 (인라인 패치)Rev 2023. 7. 29. 18:53
프로그램 내에 문자열 영역에 대한 checksum 값을 계산하여 문자열의 변경 여부를 검증하기 때문에 쉽게 수정하기 어렵도록 되어있다. 이런식의 프로그램의 경우 일반적인 파일 패치로는 해결할 수 없고 인라인 패치 방법을 사용해야 쉽게 해결 가능하다. 인라인 패치의 패치코드 위치 1. 파일의 빈 영역에 설치 2. 마지막 섹션을 확장한 후 설치 3. 새로운 섹션을 추가한 후 설치 보통 패치 코드의 크기가 작은경우 1번을 사용하고, 나머지 경우 2 또는 3을 사용
-
-
모르는 어셈블리어 정리 (cdq)Rev 2023. 7. 9. 20:24
cdq : c(convert) dq(Dword to Qword) ? The CDQ (Convert Doubleword to Quadword) instruction extends the sign of EAX into the EDX register. CDQ(더블워드를 쿼드워드로 변환) 명령어는 EAX의 부호를 EDX 레지스터로 확장합니다. +) 처음에는 뭔 소리인가 했다. 설명을 보고도 뭔소리인가 해서 직접 한줄씩 실행하고 레지스터 상태들을 확인해 보았다. cdq 명령어를 실행하자 RDX 레지스터의 값이 0으로 변화되고 이후로는 0고정이 되었고, 2번째 줄의 코드인 add edx, 7을 실행해도 edx 레지스터의 증가가 없다. 후에는 딱히 이상이 없이 코드대로 움직였다. +) 아래에 링크 해둔 참고자료를 통..
-
c언어 -> 어셈블리어 변환 연습Rev 2023. 7. 9. 14:39
//test.c #include int main(int argc, char* argv[]) { ~~~~ .... ~~~~ return 0; } 간단한 c언어 코드이다. 어셈블리어로 바꾸어 본다면 main함수에 대한 프롤로그, 에필로그가 생성된다. PUSH rbp mov rbp, rsp ~~~~ .... ~~~~ mov eax, 0 pop rbp ret 모든 함수에 대해 프롤로그, 에필로그가 생성이 되고 함수 내 코드에 따라 프롤로그, 에필로그사이에 있는 어셈블리어 코드들도 달라진다. 이렇게 함수의 시작과 끝이 생성이 되면 다음으로는 main 함수 내에 있는 인자 값인 argc, argv에 대한 어셈블리어가 에필로그 다음으로 붙는다. PUSH rbp mov rbp, rsp DWORD PTR [rbp-4],..
-
basic_exploitation_000Pwn/DH wargame 2023. 6. 5. 22:58
드림핵의 Stack Buffer Overflow 문제이다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); scanf("%141s", buf); return 0; } 해당 문제의 코드이고, 취약점을..
-
백준 10811번 : 바구니 뒤집기 (C)카테고리 없음 2023. 3. 21. 01:21
문제를 풀고 해당 문제가 C언어 풀이가 없는 걸 보고 끄적여봅니다. 선택한 범위에서만 배열의 순서를 뒤집는게 핵심인 문제 일단 범위가 작은 배열을 만들고 코드를 짜본다. #include int main(void) { int Arr[5] = { 0,1,2,3,4 }; int i, j; //뒤집을 범위 설정 scanf_s("%d %d", &i, &j); //설정 범위 중 가장 작은 값(i)과 큰 값(j)부터 시작하여 가장작은값 + 1, 가장 큰 값 - 1 씩 해가면서 값을 바꾸기 while (i < j) { int a = Arr[i]; Arr[i] = Arr[j]; Arr[j] = a; i++; j--; } for (int i = 0; i < 5; i++) { printf("Arr[%d]의 값은 %d\n",..