묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 되새기는 C 프로그래밍
리눅스 환경도 스레드 생성 원리는 동일한건가요?
리눅스도 마찬가지로 이해하면 될까요?Os 가 프로세스에게 적절한 메모리를 할당하여 프로세스에게 자원을(메모리 공간)을 주는 것으로 이해했습니다. 프로세스 안에 구성원들(쓰레드) 개별적인 행동을 하는 주체로 이루어져 있다고 이해했습니다. (PS) 저번에 어느 강좌인지는 기억이 안나지만 리눅스는 프로세스 중심 윈도우는 쓰레드 중심으로 자원을 분배한다고 들어서 구분이 필요한가 싶었습니다. 추가로 하나의 쓰레드들은 하나의 main을 실행 시킨다고 배웠습니다. 이게 여러 싱글 코어에서는 쓰레드들끼리 컨텍스트 스위칭을 하면서 동시에 실행이 되는 것처럼 보이는 concurrency 특성이 있다고 정리가 되었는데, 이때 쓰레들끼리는 멀티 쓰레드를 표현하는 것인가요? 멀티 쓰레드가 정확히 어느 레이어에서 사용하는지 구분 짓고 싶습니다. 다른 프로세스 안에 쓰레드를 말하는 것인지 코어들에서 쓰레드를 말하는 것인지 아니면 단일 프로세스 안에 쓰레드를 말하는지 정리가 안 돼서 질문드립니다.정리를 하면서 수업을 들어야 하는데 업무랑 부족한 cs 지식이랑 빠르게 수용하려다 보니 걸리는 부분이 계속 생기는 거 같습니다. 항상 답변을 친절히 알려주셔서 감사합니다.
-
해결됨독하게 되새기는 C 프로그래밍
접근권한과 위변조
실제 위변조 해킹을 할 때 여러방법이 있겠지만, 초기에 접근 권한을 얻어서 위변조를 하는 방식도 있었을까요? Win OS상에서 Hxd 프로그램을 실행하고Linux에서 작성한 bin파일을 가져와서 위변조라는 것을 하려고 하는데 수정이 불가능 했습니다.이에 따른 3가지 가설로linux상에서 bin file에 접근 권한을 chmod를 통해 주지 않았기 때문에 수정이 불가능프로그램을 저장할 때 file을 저장 시킨 system 단은 linux OS이고, binary file을 실행한 HxD프로그램이 win Os라서 불가능 읽기 전용 파일이라서? 2번은 file이 하드디스크에 물리적으로 저장해서 부르는 데는 문제가 없을 것이라 생각했습니다.3번은 HxD가 -rw-r--r-- 1 root root 256 Nov 12 16:34 rdata.bin에서 읽기 전용 파일이기 때문이라고 생각했는데, HxD는 에디터에서 건들 수 없는 것이 말이 되나 싶었습니다..1번이 문제인 줄 알고 sudo chmod 777 bin파일이름을 통해 권한을 부여하니 위변조가 가능했음을 알게 되었습니다.그렇다면 여기서 궁금한 점은 1번에 접근 권한을 허락만 하면 (다른 컴퓨터에 원격으로 제어를 하고 root사용자의 비밀번호를 얻어서) 해킹이 되지 않을까라는 생각이 들어서 질문을 드렸습니다. 너무 궁금해서 수업과는 약간 결이 다른 질문인 점은 죄송합니다..
-
해결됨독하게 되새기는 C 프로그래밍
자료구조
연결리스트를 보면서 만든적은 있으나 머리속에서 참고자 없이 만든적은 없네요 구매는 했는데 자료구조 수업 듣고 와야겠네요. 혹시 수업이 따로 있을까요?
-
해결됨독하게 되새기는 C 프로그래밍
실습 중에 혹시 예외 발생하신 분들을 위해
Enter, Leave로 동기화 후 메인 쓰레드 루프 탈출을 위해q를 입력했을 때 간헐적으로 아래와 같은 에러가 발생하였습니다요거.. 선생님께 여쭤보려다가 문득 원인을 찾았습니다혹시 저와 같은 에러를 겪으신 분들을 위해 정리를 하자면 아래와 같습니다 메인 쓰레드 루프 탈출 까지는 정상적으로 수행됩니다다만, DeleteCriticalSection 함수 호출 후 return 코드를 호출하기 전 찰나의 순간에set 또는 reset 워커 쓰레드에서 EnterCriticalSection을 호출하여 예외가 발생합니다 즉, DeleteCriticalSection과 return의 코드 호출은원자적이지 않기 때문에 두 함수가 수행되는 중간에다른 워커 쓰레드에서 EnterCriticalSection 함수를 호출하는 경우인데요 이는, Delete돼서 존재하지 않는 임계영역에 Enter를 시도하기 때문입니다
-
해결됨독하게 되새기는 C 프로그래밍
높은 메모리 위치의 쓰기 요청이 더 오래 걸린다는 설명이 이해가 가지않습니다.
안녕하세요. 강의 잘 듣고 있습니다. 강의를 보다가 이해되지않는 부분이 생겨 질문 드립니다. 하드디스크에 쓰기요청을 할 때 SSD는 HDD와 달리 물리적 장치를 사용하지 않기때문에 메모리 위치에 상관없이 빠르게 접근할 수 있는 것으로 알고있습니다. 그래서 1번 위치(995MB)에 접근해서 4byte를 쓰는 것과 1번 위치(100MB)위치에 4byte를 쓰는 것이 별로 차이 나지 않을 것이라 생각하는데요.HDD도 디스크의 외곽에 위치한 곳에 접근하는 것이 가장 오래걸린다고 알고 있습니다. 하지만 디스크 외곽에 위치한 곳이 항상 높은 메모리 위치(995MB)는 아닌 것으로 알고 있습니다.또한 공간확보라는 말씀이 잘 이해가 가질 않네요. 995MB의 위치에 4byte를 쓰는데 왜 995MB의 공간확보가 필요한 것인가요?? 파일이 0~1GB까지 연속적으로 메모리 할당을 해야하는 것인가요? 띄엄띄엄 메모리 할당을 하면 안되는 것일까요?
-
해결됨독하게 되새기는 C 프로그래밍
ShellCodeSample03.c 질문 드립니다.
강사님 항상 강의 잘 보고 있습니다.질문이 있습니다.예제에서 기계어를 배열에 담고 그 배열의 주소로 점프하게끔 되어있는데 강의에서 말씀하셨지만 배열은 데이터 영역에 있는데 어떻게 실행이 되는건가요?무슨 기능을 끄면 가능하다고 하셨는데 이 예제엔 그 기능이 꺼져있는건가요?
-
해결됨독하게 되새기는 C 프로그래밍
1강-문자(배)열 상수는 어디에 저장되는가? 관련 질문
5번째 줄에 있는 문자열과, 7번째 줄에 있는 문자열은, 같은 문자열입니다.(당연히 같은 메모리 공간에 존재)이 부분에서 궁금한 점이 생겨 질문을 하게 되었습니다. 다른 문자열로 일일이 메모리에 저장하지 않고, 굳이 같은 문자열로 저장하는 이유가 있을까요?(제 추측으로는 속도 향상을 위해서 같습니다. 하지만 개발자가 같은 메모리에 위치한다는 사실을 잘 인지하지 못한다면 오류도 빈번히 발생할 것 같은데 이유가 궁금합니다.) 같은 문자열이 아닌 다른 문자열로, 즉 다른 메모리 공간에 각각 존재시키고 싶다면, 어떻게 해야할까요? 1번에서 '개발자가 같은 메모리에 위치한다는 사실을 잘 인지하지 못한다면 오류도 빈번히 발생할 것 같은데' 라고 제가 추측했었습니다. 실제로 이러한 예시가 있는지 궁금합니다.
-
해결됨독하게 되새기는 C 프로그래밍
스택 쓰레기 값? 관련 질문 드립니다.
안녕하세요 강사님. 좋은 강의 감사합니다.강의 잘 보고 있습니다.질문이 있는데요.32비트던 64비트던 똑같이 스택 메모리에 쓰레기 값?이 있는 것이 이해가 안되서 질문 드립니다.0x00000008F9AFF924 03 00 00 00 cc cc cc cc 0x00000008F9AFF92C cc cc cc cc cc cc cc cc 0x00000008F9AFF934 cc cc cc cc cc cc cc cc 0x00000008F9AFF93C cc cc cc cc cc cc cc cc 0x00000008F9AFF944 04 00 00 00 cc cc cc cc0x00000008F9AFF94C cc cc cc cc cc cc cc cc 0x00000008F9AFF954 cc cc cc cc cc cc cc cc0x00000008F9AFF95C cc cc cc cc cc cc cc cc 0x00000008F9AFF964 cc cc cc cc 10 00 00 00 0x00000008F9AFF96C 20 00 00 00 30 00 00 00 0x00000008F9AFF974 40 00 00 00 50 00 00 00 진하게 표시한 것이 변수 값입니다.여기서 이해가 안되는 것이 int a = 3, int b = 4;를 실행하면 스택 메모리에 아래처럼 저장되는게 아니라 위처럼 띄엄 띄엄 저장되나요?0x00000008F9AFF924 03 00 00 00 04 00 00 00
-
해결됨독하게 되새기는 C 프로그래밍
안녕하세요. 질문 드립니다.
안녕하세요.강의를 몽땅.. 다 담아서 열심히 수강하고 있는 한 학생입니다.^^학습한 내용을 제대로 이해했는지 확인 하고 싶어 질문 남깁니다. OS도 결국 명령어와 데이터의 조합으로 이루어진 이진수 binary 파일인 프로그램에 불과하며disk에 저장되어 부팅 시 부트 로더에 의해 RAM으로 LOAD 되는 것이며,이 때 커널은 항상 고정 크기를 가지며 파편화가 되지 않습니다.(메모리 가상화를 OS가 해주므로)즉, 커널은 연속된 메모리 공간에 쌓입니다.프로세스들은 이 커널 영역을 공유 사용하며, 저장된 가상 메모리 테이블 등에 의해 맵핑 되구 syscall을 할 수 있습니다.또한 VMWare 등의 프로그램을 통해 가상 머신을 돌릴 때도 커널은 고정 크기를 가집니다.VM에서 실행할 때, RAM 용량 설정, Thread 갯수 설정 등의 옵션이 있는데4코어 8GB 환경이라면 VM에 2코어 4GB를 지정해주면이를 딱 조절해서 HOST와 Virtual OS는 자원을 반 씩 나눠 쓰는 개념이기 때문이고, 가상 OS 상에서의 프로세스들은 Virtual OS에 의해 가상 메모리를 관리 받습니다.검색과 고민 끝에 이렇게 이해를 했는데 잘 한 것이 맞는지,잘못된 부분이나 조언해주실 것이 있다면 부탁드리겠습니다.^^항상 잘 듣고 있습니다.감사합니다.
-
해결됨독하게 되새기는 C 프로그래밍
overrun 예시 문제에 대한 질문있습니다.
강사님 강의 OVERRUN 예제를 보며 똑같이 해보려고 하는데 overrun 경고를 잡고 실행을 중단한것으로 판단됩니다.무시하고 실행하는 방법이 있을까요?
-
해결됨독하게 되새기는 C 프로그래밍
ShellCodeSample03.c에 대하여 질문이 있습니다.
안녕하세요 선생님 질문이 있습니다.Sample03에는 WinExec , exit이 주석처리되어 있어서 선생님이 추가적으로 언급하신 함수의 주소 문제가 아닌것 같은데 '05_ShellCodeSample03.exe'(Win32): 'C:\Windows\SysWOW64\ucrtbased.dll'을(를) 로드했습니다. 0x298c 스레드가 종료되었습니다(코드: 0 (0x0)). 예외 발생(0xFFFFFFFF, 05_ShellCodeSample03.exe): 0xC0000005: 0xFFFFFFFF 위치를 실행하는 동안 액세스 위반이 발생했습니다..이런 에러가 떠서 기계어 숫자가 틀렸나 해서보니 밑줄에서 한 4개정도 가 달라서 수정하였더니 동작하였습니다.#include <Windows.h> void main() { char shellcode[] = "\x55\x8B\xEC\x83\xEC\x48" "\xC6\x45\xF4\x63\xC6\x45\xF5\x61\xC6" "\x45\xF6\x6C\xC6\x45\xF7\x63\xC6\x45" "\xF8\x00\x6A\x01\x8D\x45\xF4\x50\xA1" "\x00\x70\x41\x00\xFF\xD0\x6A\x01\xA1" "\xC0\x70\x41\x00\xFF\xD0"; char myshellcode[] = "\x55\x8B\xEC\x83\xEC\x48" "\xC6\x45\xF4\x63\xC6\x45\xF5\x61\xC6" "\x45\xF6\x6C\xC6\x45\xF7\x63\xC6\x45" "\xF8\x00\x6A\x01\x8D\x45\xF4\x50\xA1" "\x00\xb0\xba\x00\xFF\xD0\x6A\x01\xA1" "\x4C\xB1\xBA\x00\xFF\xD0"; // WinExec("", 0); // exit(0); //int *pShell = (int*)shellcode; int* pShell = (int*)myshellcode; __asm { jmp pShell } }해당 원인도 프로그램이 실행할때마다 ASLR 때문인것인가요? 궁금합니다
-
해결됨독하게 되새기는 C 프로그래밍
함수포인터기본문법 8:21초 질문입니다.
안녕하세요 선생님 질문이 있습니다.저의 경우에 디스어셈블리(release 64)로 확인한 결과int main() { 00007FF64DD11070 sub rsp,28h int (*pfAdd)(int, int) = add; result = pfAdd(3, 4); printf("Result %d\n", result); 00007FF64DD11074 mov edx,7 00007FF64DD11079 mov dword ptr [result (07FF64DD13638h)],7 00007FF64DD11083 lea rcx,[string "Result %d\n" (07FF64DD12250h)] 00007FF64DD1108A call printf (07FF64DD11010h) return 0; 00007FF64DD1108F xor eax,eax }add (메모리주소) 부분이 없는데 12세대 cpu를 써서 이런 차이가 있는것인가요?
-
해결됨독하게 되새기는 C 프로그래밍
Stack frame 관련하여 질문 드립니다.
인터넷에 검색 했을때는 64bit에서 로컬 변수 주소 배치 방향이 32bit와 다른 것이 32bit, 64bit의 자체적인 특성이 아니라 컴파일러의 환경에 따라 달라진다고 하던데 어떤 것이 맞는지 궁금합니다.
-
해결됨독하게 되새기는 C 프로그래밍
C언어 부동소수점 오차 관련해서 실제 실무적으로 해결하셨던 방법이 있을까요?
안녕하세요. C언어로 개발을 하고 있는 왕초보 개발자입니다.최근 부동소수점 관련해서 문제에 직면하게 되어서 C언어 개발자 분들은 혹시 실무적으로 어떻게 해결하셨는지 궁금합니다.제가 맡은 프로그램은 예전에는 해당 값이 소수점이 발생할 일이 없어서 인지 부동소수점 문제점 까지 크게 고려하지 않고 작성된 것으로 보입니다. 그리고 이전 개발자들도 다 퇴사하여 없고 저 혼자 해당 프로그램을 맡아 주변에 물어볼 곳 없어 여기에 질문하게 되었습니다ㅠㅠ문제점에 대해 간단히 말씀 드리면... 두서없이 급하게 작성해서 코드와 문제점이 발생했던 숫자는 정확하지 않을 수 있습니다.double a,b,c,d;a = 17772.8;b = 2338.2;c = modf(a+b, &d);a+b값이 20111 가 나오거나 아니면 오차로 더 큰 수면 그나마 다행이겠지만...modf 함수를 사용하여 실수부만 사용하고 있습니다.실제로 합산 값을 찍어보니 부동소수점 문제가 발생해서 20110.99999999 값을 갖고 있어서소수 부분 제거 후 20110 의 값만 남게 되어서 값이 정확하지 않아 문제가 발생했습니다.관련해서 해결해보신분 ㅠㅠㅠㅠ 도움주시면 정말 감사하겠습니다.
-
해결됨독하게 되새기는 C 프로그래밍
정수와 Endian 그리고 2의 보수 15:05쯤 질문이있습니다.
안녕하세요 선생님 질문이 2개 있습니다. 1) 15:05쯤에"1byte의 메모리에 64bit 상수가 주소로 부여됩니다."라는 의미가단순히 저 메모리 창에서 메모리(1byte)에 대한 주소를 2^64 까지 부여할 수 있으니까 0x자릿수가 늘어난것이다.라고 이해하면 맞나요..? 2) 추가적으로 a의 타입을 float , double로 바꾸는 경우 전혀 다른 값이 들어가던데 gpt를 통해 검색하니Let's break down the hexadecimal representation "00 00 20 41" into binary and decode it: Convert each hexadecimal digit into its corresponding 4-bit binary representation: 0: 0000 2: 0010 0: 0000 4: 0100 1: 0001 Concatenate the binary representations: 000000000000001000000100000001 Split the binary representation into its components based on the IEEE 754 format: Sign bit (1 bit): 0 (positive value) Exponent bits (8 bits): 00000000 Mantissa bits (23 bits): 00000100000000100000001 Apply the IEEE 754 formula: Sign: 1^(0) = 1 (positive) Exponent: 2^(0) - 127 = -127 Mantissa: 1.00000100000000100000001 (binary) The final value is calculated as (1 + mantissa) * 2^(exponent): (1 + 1.00000100000000100000001) * 2^(-127) = 1.00000100000000100000001 * 2^(-127) = 1.00000100000000100000001 * 2^(-23) * 2^(-104) ≈ 10 Therefore, the hexadecimal representation "00 00 20 41" corresponds to the floating-point value 10 in C. 이런식으로 설명해줬는데 부동소수점 관련된이야기인것을 알겠는데 자세히 알아야 하나요...?
-
해결됨독하게 되새기는 C 프로그래밍
스택 오버플로우 관련 질문입니다.
섹션 3 두번째 강의를 보면 스택의 크기는 보통 1MB로 설정되어 있고, 이 크기를 컴파일러 설정에서 10MB로 바꾸는걸 보여주셨는데요. 이 보통 1MB라는 스택의 크기는 운영체제 수준에서 설정된 값이 아닌가요? 어떻게 단지 컴파일러에서 값을 변경한 결과 비정상 작동하던 프로그램이 정상 작동하는 것인지 잘 이해가 되지 않습니다. 운영체제가 실행파일을 봤을 때 스택의 크기가 1MB가 아니라 달리 설정되어 있다면 그에 맞춰 실행을 하는 것인가요?
-
해결됨독하게 되새기는 C 프로그래밍
부동소수점 비교
안녕하세요! 부동소수점 비교 관련 질문이 있습니다.그간 부동 소수점(float 및 double) 비교 시 아무 생각없이 썼는데요;; 표현 범위를 넘어갔을 때 숫자가 보장이 안되어서 == 연산 오류가 있는것은 이해 하였는데요두 수의 작고 큰지 (<,>)에 대한 비교에 대해서는 오차가 없는 것 인지 궁금합니다. 감사합니다!
-
해결됨독하게 되새기는 C 프로그래밍
파일 처리와 UI 분리 #2에서 동기화가 없어도 괜찮은건가요?
File I/O를 위한 thread를 생성했을 때 User Event 받는 thread가 같은 자원에 접근하는데 동기화 없이 진행해도 괜찮은건가요?
-
해결됨독하게 되새기는 C 프로그래밍
콘솔(CON)은 파일인가요? 디바이스인가요?
제목 그대로입니다~콘솔(CON)은 파일인가요? 디바이스인가요?설명 중간에는 파일이라 하시고, 끝 부분에는 디바이스라고 하셔서요아님 두 개가 같은 의미인가요??
-
해결됨독하게 되새기는 C 프로그래밍
파일 생성해서 쓰고 읽을 시, 쓰거나 읽을 내용은 메모리에 버퍼 되나요?
fopen 해서 파일을 읽게 되면, disk 상에서 File * 포인터 주소에서부터 순차적으로 연속된 메모리 배열로 존재하게 되는 것이고, 파일을 쓰게 되면 쓰는 내용들에 메모리 버퍼에 순차적으로 쌓이다가 fclose 하는 순간 disk 공간으로 flush 되는 건가요? 이때 커널의 i/o 드라이버와 HDD or SSD의 디스크 컨트롤러가 동작하는 구조인 것이고요?추가로, fclose 함수는 blocking 방식으로 동작하는 함수 인지 알고 싶습니다.