study16 [c언어] 윤년 구하기 0. 윤년이란? 윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어떨어지지 않고, 달의 공전주기와 지구의 공전주기는 다르기 때문에 태양력에서는 하루(윤일), 태음태양력에서는 한 달(윤달)을 적절한 시기에 끼워서 이를 보정한다. (위키백과) 1. 윤년을 구하는 방법 지구가 태양 둘레를 한 바퀴 도는 시간이 딱 365일이 아니기 때문에 이를 보정한다. 보정하기 위해 4로 나누어떨어지는해를 윤년으로 하는데, 그러나 이것 또한 부족하여 100으로 나누어떨어지지 않고 400의 배수인 날 또한 윤년으로 한다. 2. 구현하기 년, 월, 일을 입력해 첫해부터 모든 일을 더하여 보여주는 프로그램을 구현해 보자. #include int mdays[][.. study/c언어 알고리즘 2022. 4. 6. [c언어] 소수 구하기 알고리즘 최적화 0. 소수 소수는 자신과 1 이외의 어떤 정수로도 나누어떨어지지 않는 정수를 가리킨다. 7을 예로 들면 1과 자기자신(7)을 제외한 2~6 가운데 어떠한 정수로도 나누어떨어지지 않기 때문에 7을 소수라고 부를 수 있다. 만약 나누어떨어지는 정수가 하나 이상 존재하면 그 수는 합성수이다. 1. 소수 구하기 1,000 이하의 소수 구하기 Level .0 #include int main(){ int i,n; unsigned long counter = 0; for(n = 2 ; n study/c언어 알고리즘 2022. 4. 5. 3.1 바이트 오더링 바이트 오더링은 데이터를 저장하는 방식이다. 바이트 오더링 방식에는 빅 엔디언(Big Endian)과 리틀 엔디언(Little Endian) 방식이 있다. 아래 예제를 확인해 보자. BYTE b = 0x12; WORD w = 0x1234; DWORD dw = 0x12345678; char str[] = "abc"; TYPE Name SIZE 빅 엔디언 리틀 엔디언 BYTE b 1 [12] [12] WORD w 2 [12][34] [34][12] DWORD dw 4 [12][34][56][78] [78][56][34][12] char [] str 6 [61][62][63][00] [61][62][63][00] BYTE 타입인 b 변수를 저장하는 방법에는 차이가 없다. 그러나 2바이트 이상 저장하는 WORD.. study/리버싱 2021. 12. 17. 2.5 "Hello World!" 문자열 패치 0. 패치 패치 기능을 이용해 프로그램의 기능을 수정하거나 추가할 수 있다. 패치 대상은 파일, 메모리가 될 수 있다. 지금은 "Hello World" 출력을 바꾸어 보겠다. main 함수 시작 주소까지 실행합니다. 00401000부터 0040104E까지가 main 함수입니다. 1. 문자열을 패치하는 방법 두 가지 방법 문자열 버퍼를 직접 수정하는 방법 다른 메모리 영역에 새로운 문자열을 생성하여 전달 1) 문자열 버퍼를 직접 수정하는 방법 MessageBoxW 함수의 전달인자 4092A0의 문자열 ("Hello World") 버퍼를 직접 수정하는 방법이다. 그러기 위해 4092A0으로 이동해 보자[Ctrl + G]. 커서가 올라가 있는 window에 따라 뷰가 달라진다. dump window를 확인해 .. study/리버싱 2021. 12. 1. 2-2 HelloWorld.exe 디버깅 0. main() 함수 찾기 앞에서 JMP로 들어왔던 0040104F으로 들어오면 많은 함수호출을 볼 수 있다. 여기 안에서 main()을 찾아보자. 1. win32API F7(step in)로 함수호출문 안으로 들어가다 보면 반복문 때문에 탈출하기 어려운 경우가 있다. 004010E4 같은 경우가 이와 같다. Ctrl + F9로 함수 탈출할 때 시간이 오래 걸리기 때문에 지금은 step over(F8)로 넘어가자. 2. CALL 00401000 함수 호출을 돌아다니다 보면 CALL 00401000을 볼 수 있다. 3. CALL 00401000 내부 드디어 우리가 찾던 main 함수를 찾았다. 오른쪽 설명을 보면 파라미터가 "www.reversecore.com', "Hello World!"인 것을 확인할.. study/리버싱 2021. 11. 11. 2-1. HelloWorld.exe 디버깅 0. 디버깅 목표 HelloWorld.exe 실행 파일을 디버깅하여 어셈블리 언로로 변환된 main() 함수를 찾자. 1. 디버깅 시작 지금 보이는 이미지는 ollydbg 실행 화면이다. 화면 구성에 대해 알아보자. Code window 기본적으로 disassembly code 를 표시하여 각종 comment, label을 보여주며, 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다. Register window CPU register 값을 실시간으로 표시하며 특정 register 값 수정이 가능하다 Dump window 프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정도 가능하다. Stack window ESP register가 가리키는 프로세스.. study/리버싱 2021. 11. 6. 정적 분석, 동적 분석, Source Code, Hex Code, Assembly Code 0. 정적 분석 정적 분석은 파일을 실행하지 않고 분석하는 방법 중 한 가지이다. 파일의 종류(EXE, DLI, DOC, ZIP 등), 크기, 헤더(PE)정보, Import, Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버킹 정보, 디지털 인정서 등의 다양한 내용을 확인하는 것이다. 디스어셈플리를 활용해 내부 코드의 구조를 파악하는 것도 정적 분석의 범주에 들어간다. 정적 분석으로 얻은 정보들은 이후 동적 분석에 방법에 좋은 참고가 된다. 1. 동적 분석 파일을 직접 실행시켜 그 행위를 분석한다. 디버깅을 통해 코드의 흐름, 메모리 상태 등을 자세히 살펴 볼 수 있다. 2. Source Code 우리가 IDE를 통해 작성하는 코드를 말한다. 프로그래밍 언어별로 정의된 문법에 따라 .. study/리버싱 2021. 11. 5. 비구조화 할당, 구조분해 할당 ES6 비구조화 할당(구조분해 할당) ES6에서 새롭게 만들어진 변수 할당 방법입니다. 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있습니다. 배열 const nameList = ["SoHee", "KangIn", "MinSu"]; const name1 = nameList[0]; const name2 = nameList[1]; const name3 = nameList[2]; 배열에 있는 값들을 서로 다른 변수에 저장하려면 이렇게 했습니다. 비구조화 할당으로는 상당히 간결하게 변수 할당을 할 수 있습니다. const nameList = ["SoHee", "KangIn", "MinSu"]; const [name1, name2, name3] = nameList; 객체 const info = .. study/JS 2021. 7. 25. 1. 프로그램 실행 구조 0. 프로그램 동작 우리가 윈도우를 사용하다 보면 exe파일을 보게 될 것이다. 더블클릭해서 누르면 프로그램이 실행되는 파일이다. 이 exe파일은 컴파일을 통해 실행 가능한 파일로 만들어지는데 이것을 윈도우에서 PE(Portable Executable)파일이라고 부른다. 1. PE 파일이란? 위에 설명이 되어있듯 휴대할 수 있고 실행 가능한 파일을 말한다. 이 PE 파일에는 프로그램을 실행하는 데 필요한 기본 정보와 파일을 메모리 어디에 저장해야 할지 알려주는 배치 정보가 들어있다. PE파일에는 헤더(Header), 보디(Body)로 구성되는데, 헤더에는 프로그램 실행에 관한 주요 정보가 들어있고 바디에는 코드와 데이터가 들어있다. PE 파일은 exe 뿐만 아니라 dll, ocx 등이 더 있다. 2. 헤.. study/리버싱 2021. 3. 16. 3. HTTP 메시지 0. HTTP 메시지 HTTP에서 교환하는 정보는 HTTP 메시지라고 불립니다. 리퀘스트 측 HTTP 메시지를 리퀘스트 메시지, 리스폰스 측 메시지는 리퀘스트 메시지라고 부릅니다. HTTP 메시지는 크게 메시지 헤더와 메시지 바디로 나눌 수 있습니다. 이 두개는 최초에 나타나는 개행 문자(CR+LF)로 메시지 헤더와 메시지 바디를 구분합니다. 메시지 헤더 서버와 클라이언트가 꼭 처리해야 하는 리퀘스트와 리스폰스 내용과 속성 등이 작성되어 있다 CR+LF CR(carriage return : 16진수 0x0d) LF(line feed : 16진수 0x0a) 메시지 바디 꼭 전송되는 데이터 CR과 LF는 타자기에서 쓰이던 방식으로 LF는 종리를 한 라인 위로 올리는 키였고, CR은 타자기 커서를 맨 앞으로 .. study/network 2020. 6. 24. 2. HTTP 프로토콜이란 모바일에서 잘 안 보일 수 있습니다. 0. 클라이언트와 서버 간에 통신하는 HTTP 텍스트와 이미지 등과 같은 리소스를 필요하다고 요구하는 쪽이 클라이언트가 되고, 이러한 리소스를 제공하는 쪽이 서버가 됩니다. HTTP를 사용하여 2대의 컴퓨터 간에 통신을 하는 경우, 한 번 통신을 할 때마다 반드시 어느 한쪽은 클라이언트가 되고 다른 한쪽은 서버가 됩니다. 이와 같이 HTTP는 클라이언트와 서버의 역할을 명확하게 구별하고 있습니다. 1. 리퀘스트와 리스폰스 HTTP는 클라이언트로부터 리퀘스트(요청, Request)가 송신되고, 그 결과가 서버로부터 리스폰스(응답, Response)로 되돌아옵니다. HTTP 통신의 시작은 클라이언트가 되겠고 마무리는 서버쪽에서 됩니다. 클라이언트 리퀘스트 GET /ind.. study/network 2020. 6. 22. 1.4 IP, TCP, DNS 그리고 URI와 UR 0. 배송을 담당하는 IPIP(Internet Protocol)를 계층으로 말하자면 네트워크 계층에 해당됩니다. 이름 그대로 인터넷을 활용하는 거의 대부분의 시스템이 IP를 이용하고 있습니다. 간혹 'IP'와 'IP 주소'를 혼동하는 사람이 있는데 'IP'는 프로토콜의 명칭입니다. IP의 역할은 개개의 패킷을 상대방에게 전달하는 것입니다. 상대방에게 전달하기까지 여러 가지 요소가 필요한데, 그 중에서 IP 주소와 MAC 주소(Media Access Control Address)라는 요소가 중요합니다. IP 주소는 각 노드에 부여된 주소이고, MAC 주소는 각 네트워크 카드에 할당된 고유의 주소입니다. IP주소는 변경 가능하지만 기본적으로 MAC 주소는 변경할 수 없습니다.예를 들어 서울대 기숙사에 택배를.. study/network 2020. 4. 21. 이전 1 2 다음