저희 회사는 마이크로소프트 社의 소프트웨어를 납품합니다.


그리고 저는 늘 새로운 버전을 가능한 한 빨리 출시되면 설치하고 사용해 보려고 합니다.


예전에는 그러면 테스트 케이스가 되어서 하지 않았지만 요즘은 그래도 안정적인 편이어서^^;


이번에는 회사에서도 저희를 통해 소프트웨어를 구매하시는 분들께 안내를 해드려야 되기도 하고,

(물론 회사에서 저는 본 업무를 직접 담당하지 않아요. 저는 보안 엔지니어 입니다.)


anyway..뉴스레터로도 활용할 자료를 작성할 겸해서 겸사겸사 Microsoft Office 2019 변경된 설치 방법을 안내 해 드리고자 합니다.


조직(개인 제외) 사용자를 위한 볼륨라이선스 버전의 배포를 수행하는 것이 변경된 것입니다.

본 내용은 "Online 설치를 진행"하는데 어려움이 없도록 "가이드"를 제공합니다.


참고로 본 내용으로 작성된 내용은 "불펌은 자제" 부탁드리고, 펌을 하실 경우에는 반드시 댓글, 출처 공개 부탁드립니다.


시작합니다.


간략히 과정을 설명 드리자면

1. ODT(Office Development Tool, 이하 ODT) 설치

2. Configure.xml 파일 수정

3. 2번 파일의 설정을 토대로 다운로드 & 설치

4. 설치 완료 후 라이선스 등록 / 사용


4가지 단계나 보이지만 사실상 뭐 없습니다. 간단해요. 모를 땐 답답할 수 있으나 알고나면 간단한 그런? 겁니다.


상세과정 갑니다.


1. ODT 설치


- 아래의 URL을 통해 설치 파일 다운로드(왠일인지 요즘 브라우저들로 MS 다운로드 사이트가면 중간에 하얀 바만 생기던데 여기서 다운로드는 안되고 흠..뭔지 모르겠어요.)

- https://www.microsoft.com/en-us/download/details.aspx?id=49117

- 제가 설치한 파일이 Hash값 : 3adf5172d4f80f94e18669ba7da193a9b8a1390a

왼쪽 체크 박스 클릭 해 주시고 오른쪽 컨티뉴~!


새로운 폴더를 추가 해 줍니다. 저는 D 드라이브에 "office2019" 라는 디렉토리를 만들어 보았습니다.


확인을 눌러주세요. 여기서 Successfully 가 아닌 Failed 가 떨어질 경우 "권한" 문제를 한번 확인 해 보시길 바래요.


그리고 설치를 진행한 (사실상 압축 해제한 듯한..) 디렉토리로 이동하셔서 XML 파일을 수정해야 합니다.



2. 상세과정, XML 파일의 수정


파일의 내용을 보면 수정을 하면 되는 부분을 제가 별도로 색상별 박스 처리를 하였습니다. 

하나하나의 그룹으로 보시면 됩니다. 중요한 것은 가. 언어나. Product ID 부분입니다.

추가 하실 때는 기본적으로 존재하는 라인을 Copy & Paste 하셔서 수정만 하셔도 되고, 직접 입력을 하셔도 되는데, 오탈자나 공백등을 우려하신다면 복사하시길 권유 드립니다 *.*


수정 예시 입니다. Product ID=" " 이 사이에 다운로드 & 설치를 하고자 하는 내용을 입력하시면 됩니다.

Language ID=" " 이 부분에 희망하는 언어를 입력하시면 됩니다.

다운로드 또는 설치 하는 제품 

 볼륨 라이선스 버전의 Office 2019에 대한 

유효한 값은 다음과 같습니다. 

(제품 ID)

예: Office Professional Plus 2019

 ProPlus2019Volume
 Standard2019Volume
 ProjectPro2019Volume
 ProjectStd2019Volume
 VisioPro2019Volume
 VisioStd2019Volume

언어는 "en-us" 나 "ko-kr"정도만 기억하시면 될 듯 합니다.

수정을 마치면 "희망하는 이름으로 저장" 을 합니다. 해당 지정한 파일명을 그대로 "명령어에 입력"해야 하기 때문에 ****잊으시면 안됩니다.



3. Download & Installation 과정



또 하나의 깨알 꿀팁과 함께 방법을 안내합니다. CMD 나 Powershell등에서 명령어를 입력하려면 "PATH" 문제에 의해 경로 이동을 해야할 경우가 있는데, GUI가 기본적으로 제공되는 윈도우의 경우 CLI(Command Line Interface)에서 경로를 이동하는 부분들이 번거로운 부분들이 있습니다.

CMD 등을 실행하여 번거롭게 이동할 필요 없이 해당 탐색기 경로에서 "Shift" 키를 누른 상태에서 "마우스 우클릭" 을 입력하시면 위와 같이

주황색 박스와 같은 메뉴가 추가로 팝업 됩니다. "여기에 PowerShell 창열기 클릭~♡"


그러면 위와 같이 바로 해당 경로에서 CMD 또는 PowerShell 창이 실행됩니다.(Windows 10 버전 기준 PowerShell 이며, 본 온라인 설치 관련은 Windows 10에서 이용해야 한다.)

그리고 위와 같이 --> setup /download 지정한파일명.xml <-- 을 입력해 줍시다. 관리자 권한은 필요 없어요!

눈치 빠르신 분은 아시겠지만, xml 파일 조건에 대해서 설치 파일을 다운로 하는 과정입니다.

!!!! 조직에서 설치 방법이 상기와 같이 바뀌었습니다. 그런데 최근 우리나라의 조직 운영상 "망분리"가 된 구조들이 많으실텐데 그러한 경우는 자료 전송 구간을 통해서 입력하시거나 USB 등을 이용하시거나 해서 분리된 망으로 옮겨주는 방법이 있겠죠.? 그리고 해당 다운로드 받은 파일을 복사해서 사용 가능합니다.

!!!! 고로 한번만 다운 받아서 복사해서 "설치만 명령어로 한줄" 해주셔도 된다는 얘깁니다. 


* 다운로드 하고자 하는 Product 및 언어 별로 용량이 조금씩 다릅니다. 

** Office 의 경우 2GB대 인 듯 한데, 여기서 저는 Visio 와 Project를 같이 다운로드 하였습니다. 하여 약 3.7GB 정도의 용량을 차지하는 걸 확인하였습니다.



설치 명령어 입니다.


예시 화면

또 다른 예시

보시면 아시겠지만 download -> configure 로 바뀐거 외에는 어려운게 저~~~언혀 없습니다.

이정도는 다 따라하실 수 있으실 겝니다.



뚜둔 설치가 진행됩니다.(이전에 팝업들이 2개정도 되는데, 너무 빨라서 놓쳤습니다^^......)


설치 완료 후 "닫기"



4. 라이선스 입력 후 사용 단계(마지막 과정)

아무 Office 프로그램 하나 실행 해 줍니다.

저는 Word로 하였습니다.(무관)



위에서 "파일"을 누르면 위와 같은 메뉴들이 왼쪽에 나탄납니다.

그중에서 "계정" 메뉴를 클릭하시면 라이선스를 입력할 수 있는 형태가 진행이 됩니다.

(과정에 따라 제품 주문번호를 입력하는 형태의 설치도 있습니다.)

저기서 "제품 키 변경"을 눌러주세요.



위와 같이 제품 키 입력이 가능한 창이 뜹니다.

문자열 (-하이픈 제외) 기준 25자의 라이선스를 입력하시면 됩니다. 일일이 입력 뚜드리시지 마시고,

Copy & Paste하시면 됩니다. 문자가 기존에 -(하이픈) 까지 포함하여 표기되어 있어도 같이 복사해서 넣으셔도 됩니다. 알아서 잘 되요. 공백만 주의.

입력하시고 잠시 기다리시면 입력된 키가 올바른 형태인지 검증하고, "정품 인증" 메뉴가 활성화 됩니다.

그러면 꾹 눌러주세요.


그리고 잠시 대기......



위와 같은 화면이 뜨면 인증이 완료된 화면입니다.

참고로

Visio와 Project는 개별 라이선스를 가지고 있습니다. 그래서 위의 라이선스 입력 과정을

개별로 각각의 라이선스로 진행해주셔야 됩니다. 잊지 마세요~~~!


자~~~! 여기까지가 이번에 변경된 설치 방법에 대한 설명입니다.


사실 알고보면 그리 어렵지 않습니다. 단지 기존의 설치 방법들에 비해 생소한 부분이 있기는 합니다.

어렵지 않아요~ 잡아먹지 않습니다.


도움이 되셨길 바랍니다^^


감사합니다.















Ping of Death


DoS 의 공격 기법 중 하나로 


OSI 3 Layer 프로토콜 중에는 ICMP를 이용하는 Ping 명령어가 있다. 많은 IT인들이 "Ping"이라는 명령어를 통해 특정 IP 에 대한 활성 여부를 체크한다.


물론 중간 혹은 수신 입장에서 ICMP를 차단한다면 응답이 없겠지만, 많은 분들이 호스트의 "Alive or Dead" 여부를 Ping으로 많이 사용 한다.


우선 Ping 을 실행하면 많은 내용들을 알 수 있다.


여러가지 정보들을 토대로 추정하면 "OS"를 추정할 수 있다.(물론 절대치는 아니다. 몇 개의 값으로 절대적인 정의를 내릴 만큼 보여지는 값이 유니크하지는 않다.)


추론 할 수 있는 근거는

TTL, 1 Packet 당 Data, 생성되는 패킷에 채워지는 데이터 내용 등이 있다.


자. 여기서 Ping of Death는 과도한 Ping 발생을 통해 수신자의 DoS 를 유발하는 것이다. 간단하지 않은가?

(본 내용에 나오는 IP는 직접 연결되지 않는 IP들이라 가리지 않습니다.)


 일반적인 Ping 명령어를 통해 1건 발생 시킨 결과.

기억해 둘 Point !!

Byte : 32  /  TTL : 64



 

 위의 Ping을 발췌한 wireshark 

Request TTL(Time To Live)과 Reply TTL이 다름을 알 수 있다.

이 내용으로 패킷을 발생시키는 호스트의 특성에 따라 TTL이 바뀜을 알 수 있다.



 

 (ICMP는 OSI 3 Layer 프로토콜로 4 Layer 이상의 정보가 없다.)



 

ICMP 의 하위 내용을 열어 DATA부분을 클릭하면 아래의 사각표와 같이 32bytes가 채워진 DATA가 무엇인지 확인이 가능하다.

32bytes데이터를 채우기 위해 a에서부터 z까지 소문자 알파벳으로 데이터를 채웠다.(중요함)



 

 ping으로 왜 dos 를 유발할 수 있는 지 개념을 잡기 위해 사이즈 증가 옵션을 알아본다.



 

 사이즈 최고치는 65500으로 설정이 가능하다.

(앞서 설명한적이 있지만 2의 지수승 증가 값들은 기억해두면 쉽게 기억할 수 있는 것들이 많다. 65536은 2^16 값이며, 이는 TCP Window Size. 여기서도 비슷한 값을 최대치로 설정되어 있음을 확인할 수 있다.)



 

 이 이미지는 Windows XP에서 발생 시킨 Ping이다. 위의 Windows 10과 같은 형태로 데이터를 채워 넣는다.



 

 역시나 마찬가지로 설정할 수 있는 최대 수치가 보인다.



 

 위는 Kali linux 에서 설정 가능한 ping 패킷 사이즈를 확인하였다.

옵션은 -s로 한다.



 

 윈도우 보다 최대치가 7 바이트 높다.



 

 Kali 에서 Ping을 발생시켜보았다.

송신자 TTL 이 64이며 수신자(윈도우)가 128의 TTL로 패킷이 생성되었음을 알 수 있다.

Kali의 경우 특수문자숫자의 조합으로 데이터를 채워 나감을 알 수 있다. 

아울러 64ttl로 채우는 리눅스의 경우와 윈도우의 128 ttl로 생성되는 경우가 있음을 확인할 수 있다.



 

 

 kali에서는 기본 ping 사이즈가 64byte설정됨을 확인할 수 있다.



 역시나 응답 또한 동일한 데이터를 채워넣어 보냄으로써 요청한 통신에 대한 응답임을 체크(중요)한다.
(물론 여기서 시퀀스라던지 id라던지 개념으로 요청과 응답의 쌍을 보는 기준이 더 있긴하다.)



 

 최대치인 65507로 사이즈를 설정하여 발송하여 보았다.

여기서 ping of death가 문제가 되는 이유를 설명할 수 있다.

(해당 계층 정보 등이 추가된 헤더가 8byte추가되어 65515 byte로 발송되었음을 확인할 수 있다.)



 

 실질적으로 문제를 유발하는 내용들이다. 위의 내용까지는 데이터 사이즈를 증가하여 발송해도 응답이 온 내용 결과

1개만의 메시지가 출력되는 데 실상은 전달되고 응답이 오는 패킷이 fragment된 갯수만큼 데이터를 채워서 전달한다.

패킷 사이즈 설정 값 / mtu 를 한다면 대략적인 fragment에 의한 갯수 숫자 계산이 가능하다.



 

전송된 하나의 패킷으로 보여지는 것이 실제로는 fragment되어 전송된다.

그리고 more fragment의 끝을 알리는 최종 패킷들만 icmp로 wireshark 검색이 되고 그 나머지는 icmp로 검색이 되지 않는다.(ip.addr==x.x.x.x로 검색가능)


마지막으로 kali에서는 큰 사이즈의 ping을 생성 시 특수문자로 시작하여 영대문자, 영소문자로 반복되는 데이터를 생성하여 채워나감을 알 수 있다.




여기까지가 일반적으로 윈도우, 리눅스에서 테스트 가능한 Ping of Death DoS에 대한 개념 이해이다.

위와 같은 특성으로 Ping 사이즈를 높여 과다로 발생 시킨다면, 수신자(공격대상) 입장에서는 수신한 만큼 동일한 데이터를 생성하여 전달하도록 되어 있으므로반복 데이터 생산하는 과정에서 부하가 발생된다.


오늘은 Ping 하나로 여러가지 정보들을 추측할 수 있다고 하였고, 사실상 공격자체만 보면 icmp 를 큰 사이즈로 과다 발생시키는 간단한 공격인데, 그 개념을 이해하기 위한 기초적인 부분들까지 설명하였다.


아울러 해당 공격을 방어하기 위해서 보안 장비들에서는 특정 사이즈 이상의 Ping 패킷이 발생될 경우 차단하는 형태로 방어를 할 수 있는 부분들이다.


아무쪼록 이러한 공격들을 학습하는 이유는 기본 개념의 이해를 통해 응용을 "좀 더 쉽게" 이해하고자 하는데 있다.



이번에는 DoS 의 한 종류인 Arp Spoofing을 이해하고자 한다. 늘 강의를 다니면서 부가 설명 하는 것은 기본을 이해하면 "응용"부터 학습하는 것보다 쉽다. 라고.. 물론 100%는 아니겠지만.. 어느정도는 맞다고 생각된다.


ARP SPOOFING

ARP Spoofing을 이해하기 위해서 우선 "ARP"와 "Spoofing"을 각각 이해해야 한다.


ARP - Address Resolution Protocol

=> ARP를 이해하기 위해서는 IP와 MAC 통신에 대해서 이해를 요구 한다. 

-> IP는 물리적 거리 무시하고 다른 브로드캐스트 도메인 영역과의 통신 시에도 사용될 수 있는 "OSI Layer 3" 주소 정도라는 것은 기억해야 하고,

-> MAC은 "OSI Layer 2"계층 주소이며, 같은 브로드캐스트 도메인 영역에서 통신하고자 할 때 사용되는 "필수"주소라는 중요한 것을 잊으시면 안된다.

-> 그리고 IP보다 MAC 이 우선 통신 주소로 이용되며, "중요"하다. IP는 달라도 MAC이 맞다면 패킷이 전달되고(핵심), IP가 맞아도 MAC이 다르다면 NIC에서부터 패킷 처리를 할 수 없으니까.

ARP는 IP를 알지만 "실질적인 패킷 전달을 하기 위해서" "MAC"주소를 필요로 하는데,(MAC주소를 모르면 패킷 전달 못하고, 통신이 안됨.) IP는 알지만 MAC을 모를 때 MAC을 알기 위한 과정이다. (라우팅에 대한 개념은 별개.)


Spoof - 사전적 의미를 보자.

ARP와 Spoof를 이해하면 기본적으로 "아 대충 뭐 그런거구나."라는 건 이해가 갈 내용이다.




자 다음은 실제 따끈따끈한 테스트 환경이다.


1. 패킷을 수집당할, 피해자, VICTIM의 PC IP이다.

IP : 1.1.1.139

MAC : 00-50-56-23-B2-C4

IP range : 24bit


2. 패킷을 수집할 Attacker, 피고인의 PC IP이다.

IP : 1.1.1.140

MAC : 00-0C-29-B6-13-D2

IP range : 24bit



3. 같은 네트워그 대역임을 확인시켜주기 위한 정보들이다. 



4. 공격 당하기 전 정상 상태의 VICTIM의 ARP정보이다.

(ARP 라는 것은 ARP 명령어를 통해 추가 정보를 확인하거나, 설정이 가능하다.)

arp -a 의 경우 현재 해당 단말의 arp 목록 정보를 확인한다. 각 시스템들마다  arp 확인이 가능한 경우 제 각각의 명령어들이 존재한다.



5. 우선 갈취하는 정보는 ftp로 테스트를 진행하였다.

(FTP : File Transfer Protocol, 파일 송수신간 사용되는 어플리케이션)

아래는 FTP 서비스를 열어둔 서버의 로그(시간이 다르지만 양해바란다. 당연히 시스템 시간 문제 없을 줄 알았다...ㅠㅠ)


6. 실제 arp spoofing에 의해 공격당해 발생된 시스템의 arp 정보 내용

arp spoofing은 수집하고자 하는 대상의 arp정보를 강제로 갱신토록 하여 수집한다.

이는 (별도의 보안 시스템이 설정된 경우를 제외.) 일반적으로 정상적인 정보 갱신을 이용하거나 할 때, 시스템의 운영체제와는 별개의 문제로

정보가 유출될 수 있다. 

arp 정보의 침해를 받아 공격자의 MAC 주소와 1.1.1.139가 바라보는 Gateway의 MAC주소가 같아졌다.
그로 인해 실제 패킷이 GW가 아닌 1.1.1.140에게 전달되는 것이다.

위의 패킷 덤프 내용을 보면 공격자 1.1.1.140(00-0C-29-B6-13-D2)가 각 두 피해자 1.1.1.2(GW), 1.1.1.140(VICTIM)에게 자신이 중간에서 가로채기 위한 ARP Reply 패킷을 발송하고 있다.

이로 인해 각 두 피해자는 ARP Reply 값에 의해 ARP 정보가 갱신되는 것이다.



7. 실제 공격을 통해 유출된 FTP 로그인 패스워드 정보(일부러 틀린 값을 입력하였고, 해당 내용이 평문 그대로 갈취 되었다.)

해당 도구는 Cain & Abel이라는 도구를 이용하였으나, arp spoofing을 이용할 수 있는 도구는 여러 종류이다.




대응방안.

간단하다.

보안 솔루션(NAC 또는 ARP+IP를 고정할 수 있는 무언가)을 사용하거나 End user, 단말 단에서는 ARP -S 등의 명령어를 통해 Static 한 값으로 등록하여 사용한다.

대부분 Static 은 Dynamic보다 우선시 된다.

하지만 "오타"를 조심하자.




DDoS 의 공격 방식에는 여러 가지 방식이 존재한다.


그 중 Application Layer 의 공격 종류 중 Slow Read Attack 혹은 Slow HTTP Read DoS 등으로 불리우는 공격에 대해서 알아보자.


우선 이 공격을 이해하기에 앞서 TCP에 대해서 이해를 요구하게 된다.

모든걸 다 할 순 없으니, 필요한 부분들만 설명하겠다.

"RFC 1323" 이 있다.

해당 문서의 제목은 "TCP Extensions for High Performance"  


여기에서는 TCP의 Window Size 에 대해서 언급한다.

(OS Windows 말고...)


Window Size라는 걸 간략하게 설명하자면, TCP 통신에 있어 통신 속도에도 영향을 줄 수 있고, 데이터를 주고 받을 때 이 값에 의한 크기 만큼 데이터를 주고 받는다.

이 값은 여러분들이 인터넷 속도 체크를 할때 TCP를 통한 속도 체크를 사용하는 방식에서도 영향을 준다.


아울러 이 값은 "랜덤 상태 조절"이 Default 값이다.


시작 -> 실행 or 윈도우 키 + R을 눌러 "CMD" 명령어를 입력하거나 커맨드 창을 열어 다음과 같이 입력해 보자.


"netsh interface tcp show global"

거기엔 OS의 언어에 맞게 옵션 값이 출력되는데, 한글 기준 "수신 창 자동 조정 수준"으로 표기가 된다.


이것이 TCP Window Size에 대한 옵션 값이며, 기본 Normal 로 자동 조정된다.


자, 이 값이 왜 중요할까?


 - 우리가 연결된 통신 경로를 통해 데이터를 주고 받음에 있어, 주고 받는 데이터의 경우에 따라 "사용되는 Hareware Resource"가 제각각이다.


어떤 녀석은 데이터 처리하기 위해 하드웨어 CPU, 메모리 등의 자원을 많이 쓸수도 있고, 가벼운 녀석도 있을 것이고..


그러면 이 Window 값이 만약 고정이라면? 내가 1만큼 수신 처리가 가능한데 100만큼이 고정 값으로 되어 있다면?


반대로 100만큼 처리가 가능한데 1만큼씩만 처리하기 위해 수신된다면?


무조건 고정적으로 하는 값은 상황에 따라 옳지 못한 설정 값이 된다. 그래서 기본 자동으로 되어 있으며, 통신에 따라 자동으로 "Window Size"를 조정하여 데이터를 송수신하며, 처리에 병목이 생기지 않도록 조절한다.


그럼 해당 공격은 거의 이해가 끝났다고 볼 수 있다.




이건 내가 강의할 때 만든 자료 중 한 페이지이다.


여기서 진상고객은 "Client, HTTP 서비스 요청자 또는 공격자"가 되시겠다.

카페직원은 당연히 "Server, HTTP 서비스 제공자 또는 Victim"이 되시겠다.


이 공격은 "TCP 통신의 정상 과정"을 "악용" 하는 공격이다.(차후 여러가지를 올리겠지만, 정상적인 통신과정을 조작하거나, 악용하는 공격들이 굉장히 많다.


과정은 이렇다. 기본적으로 Application Layer공격은 "세션이 수립된 상태" 즉 3 Way Handshaking이 끝나고, TCP Connection 상태 정보에 "Established" 상태에서 발생된다.(기본적으로 중요한 개념이다. 기억해두자.)


이후 HTTP 어떤 페이지의 정보를 요청하고자 할 때 공격자는 자신이 요구하는 페이지 정보와 자기가 얼마만큼 "처리가 가능한지"에 대해서 TCP Window Size를 지정하여 발송한다.

 TCP Window Size 예시 1

RFC 1323에 정의된 Window Size 크기에 대한 설명

 

 


공격자가 악의적으로 해당 WIndow Size에 대한 값을 "작게" 설정하여 또는 "0"으로 설정하여 요청을 보낸다면?


서버 입장에서는 정상적인 요청에 해당 Window Size에 의해 세션은 수립된 상태이나, 강제적으로 단절 시키거나 하지는 못하고, "세션 연결"을 유지하게 된다. 이때 Client 입장에서도 세션이 끊어지지 않도록 하기 위한 데이터를 간간히 보낸다.


실제 이 패킷들은 흔히 알고 있는 Flooding류 공격에 대비하여 패킷 사이즈가 크거나, 많은 대역폭을 잡아먹거나 하질 않는다.


그래서 정상적인 통신과의 구분 방법이 "모호"하다고 할 수 있다.


 

Kali 에 slowhttptest를 설치 해 봤다.

 


해당 공격 테스트를 위한 예시 명령어.(실제 회사 원격 지원 서버 페이지로 공격)

 

 예전엔 잘 죽었는데, 잘 버틴다.

초당 50건의 연결을 하고, 10000 건의 연결 공격에서 현재 4090 개 연결


 

 

해당 공격패킷을 실제 pcap으로 발췌한 내용.

[TCP ZeroWindow] 가 눈에 들어온다.


해당 공격은 그럼 방어하려면 어떻게 해야 할까?

여러가지 DDoS 공격 대응 솔루션들이 있지만, 기본적으로 해당 공격이 어떤 형태로 발생되는 지를 먼저 이해할 필요가 있다.

그리고 서버 자체에서 이 공격을 해결할 수 있으리라고 생각하는 것은 큰 오산.


난 늘 그렇다. 공격을 방어하려면. 그 공격을 이해해야 하고, 그 공격을 이해하기 위해 응용이 되기 이전 기본을 이해할 필요가 있다고...










define

=> 정의하다.

define의 ine를 뺀 def. IT를 오래 하다 보니 대충 예상은 된다. 뭔가 이걸로 지정한다는 건데,


무엇을 어떻게 하는 걸까.?

알아보자.

 

 이 코딩은 기본 구조를 나타낸다.

def 정의할이름(): 여기서는 hello 되시겠다. ":(콜론)"은 빠뜨리지 말자.

     hello라는 여기서 변수라는 의미로 받아들이면 이해가 쉽다.


hello()를 한다는 것은 print("Hello Python!") 을 실행한다는 것과 같다.

여기서 "인자" 라는 말이 나오기 시작한다. 

hello라는 것을 함수로 만들고 괄호의 범위안에 "인자"를 받아들이는데


여기서 인자는 print 블라블라 가 되시겠다.

 2,3번을 보면 print 를 하는데 위의 인자를 "name"이라는 변수를 만들고

- 아래의 hello2라는 호출에서 " "안의 내용을 name이라는 변수로 받아들이겠다는 거 되겠다.(옳게 이해한건가요?!ㅠㅠ)


- 그래서 hello! Justion이 되는 것이다.


아직 이 구조가 명확하게 이해가 되지는 않지만.. 용도는 어느정도 알겠다.



 

 

 

 자, 이제 조금씩 정말 이해가 어려워지기 시작했다.


- 위의 내용은 딱 봐도, 숫자를 입력받아 사각형 크기를 구하는 것


아래는 삼각형에 대한 넓이 값을 구하는 것.


밑변 곱하기 나누기 2(다 기억나시죠..?저 처럼. 기억나시는거 맞죠?)


여기서 새로이 "return"이라는 것이 등장. 계산의 결과 값을 C로 받아 C를 위의 결과값으로 반환.(반영)한다는 의미.

a와 a를 곱한값을 C로 넣고, 그 C를 결과값으로 반환.

a*h /2 결과 값을 C로 저장하여, 그 c를 결과값으로 반환.


사각형과 관련하여 넓이를 구하기 위해 한변이 4인값을 넣는다. 그리고 그 4가 담긴 "s1"을 제곱하는 형태를 만든다. 이것이 square(s1), 그 하단에 s1과 s2를 출력하라는 것은 

한 변의 길이와 사각형의 넓이를 구하는 값이 된다. s1 = 한변, s2 = s1 * s1(위의 c= a*a)


 

 sum_func(이름은 중요하지 않다. 그저 이해하기 쉽게 만들어주는 듯)

for(반복문) x 만큼 x는 range(범위) = 1부터 n(입력 인자값)+1까지 

그리고 그 값을 최초 0의 값을 가진 변수에 반복 +1 하며 더한 값을 저장.


최초 s = 0 의 값이 있고, 이 값에 1에서 임의로 입력하는 인자 값 만큼 반복하고, 반복되며 증가하는 값만큼 S로 입력한다. 그리고 그 s를 결과 값으로 반환하는 코딩


1에서 1,2,3,4,5,6,7,8,9,10 이 되면서 계속 값을 더 한 값을 s에, 1~100까지 증가하는 값을 더한 값을 s에 저장하여 각각 55과 5050을 반환하는 코딩

위의 응용 위는 0을 최초 값으로 "덧셈"을 줘서 반환 결과 값이 0이 나올일이 없었지만

아래는 곱셈을 연산하는 것이기 때문에 기본 값이 1이다.


1*2*3*4*5 = 120

10은 알아서 계산하자.^^

 









while 문이 시작되었다. for 와 같이 반복문.

구조가 조금 다르다.

 

 x 에 1을 대입.

그리고 1에서 부터 1 + x값을 만들어

x의 값이 1씩 증가 하는 것을 만드는 단순 반복문

앞서 for 문에서 11까지 지정하고 10까지 반복되었다면

"<="로 표현하여 10과 같거나 작을 경우로 표현하여

10까지 계산한다.


 

 s 와 x의 의미를 구분하여야 한다.

s 는 계산 결과 값이 누적되어 합산

x 는 현재의 순서라고 할 수 있는 값에 + 1씩 누적


 

 역시나 또 랜덤 모듈을 import하여 놀이를 만들었다.

n이라는 변수에 1에서 30사이 값 중 랜덤 값을 넣고

그렇게 선택된 랜덤값과 

내가 입력한 값을 비교하여 Yes or No를 비교하는 게임


 

 이해를 하기 위해서 위의 내용과 머리속에서 생각을해서


응용 코딩을 해봤다.


각 a와 b에 랜덤 값을 넣고 랜덤 값을 서로 더한 값을


변수 c에 넣는다.

그리고 내가 입력한 값과 비교를 하는 걸로..


살짝 아주 살짝 응용을 해봤다^^;



이번 학습한 내용들은
변수와 비교 연산자. 랜덤과 비교 연산자에 대한 내용들이다.

변수의 경우에는 아직까지는 "입력한 문자열" 을 "정수형 변수"의 값으로 넣는 거 말고는 단순하기 때문에 크게 주의할 만한 것은없어 보인다.

비교연산자의 경우에는 if문이 여러개 일 때 else가 동작하는 조건은 비교할 if문 갯수가 모두 "true"로 결과가 나올 경우 else 문이 실행되지 않고
단 한개의 if문이라도 true 결과값을 뽑아내지 못한다면 else가 동작한다는 걸 알게되었다.(테스트 한 것 까지만 했을 땐 그렇네요.)

랜덤은 궁금증이 생긴다.
random.randint(숫자범위ex 1,360)를 지정하는데, 옛날에 어디선가 랜덤을 뽑아내는 것도 결국 어떤 산술 연산자에 의한 결과 값이라고 해서
100% 무결한 랜덤 값은 없다고 봤던 것 같은데..(이 부분에 대해서 현재의 수준을 아시는 분은 조언좀 부탁드립니다.)

아무튼, 랜덤으로 뽑아 내는것과 내가 그 값을 계산하여 결과 값을 입력하고, 그 두 값을 비교하여 결과를 뽑아 내주는거. 여기까지는 어려울 게 없다.

하지만 혼자 코딩을 뽑아내라고 한다면 가능할까??

말나온김에 머리속에 자연스럽게 되도록 코딩을 똑같은걸 한 10번 반복 입력해봐야겠다.



 

 변수 a에 입력 된 3.

그리고 하단에 a의 값과 비교 연산자 출동

두번째 if문에서 변수 a의 값이 3과 같냐는 질의에 해당되어

B를 출력

그리고 if문 3개중 else에 해당되는 이유가 첫, 세번째의 if의 경우 a의 값이 각 2와 4가 매칭이 되지 않기 때문에 else 조건 값이 적용된다.

테스트 결과 모든 if문의 대입값을 3으로 수정하여 테스트 하면

결과값은 "B,D"가 아닌 "A,B,C"가 된다.


 

 12+23= <- 이 값은 출력되는 값.

이후 어떤 값이 입력되면 그것은 변수 x 에 저장한다.

그리고 x를 정수형 변수 a로 저장(물론 숫자값이 입력되어야 겠지??일반 문자를 입력하면 안됨.)

그리고 비교 연산자 시작, if에 입력한 a의 값과 12+23의 값을 비교한다.

당연히 여기서 입력한 숫자가 35라면 "천재!"가 출력될 것이고 아니라면 뭐...바보니?


 

 이 코딩과 다음 코딩은 연관성을 갖고 봐야한다.


우선 모듈 호출에 새로운 모듈이 등장해다. "random" 

말그대로 랜덤으로 뽑아내기 위한 모듈.


t.shape와 speed는 이제 생략

for구문을 해석하자면

1. 20이내의 숫자를 1부터 반복하여 x에 대입. 총 20번 동작하겠지?

random.randint(1,360)은 1부터 360이내의 랜덤한 값을 a라는 변수에 넣는것.

 

 여기서 t.setheading은 위에서 랜덤하게 입력된 a의 값 만큼 "각도"를 수정하는 것.

그리고 각도를 수정한 뒤 20만큼 이동한다.

여기까지가 위의 코딩이고

다음의 코딩은 이동 거리 또한 특정한 값 범위를 지정하여

t.fd() 괄호안에 랜덤으로 입력된 이동 거리를 집어 넣음으로써

이동거리 또한 각도와 마찬가지로 랜덤한 값을 이동하게 된다는 것.


 

 이제 랜덤과 if, else 조건문이 합쳐진 코딩이다.

a와 b라는 변수에 각 1~30 까지의 랜덤한 숫자를 집어 넣는다.


그리고 입력한 값 x를 정수형 변수 c로 넣고

랜덤하게 산출되는 결과값에 대비하여 내가 입력한 값이

정확한지를 비교하는 코딩이다.


이정도까진 아직 쉽네^^




이게 조금 입력들을 해보다보니 뭐랄까, 이정도까지는 코딩의 구조?를 약간이지만 이해하게 되는 것 같다.

옛날에 막 지역변수 전역변수 이런 말은 참개념자체가 너무 어렵던데....







이제부터는 살면서 언어 부분에서 처음 시도 해보는 깊이의 수준이다.

입력문. input(입력함수)에 대하여 학습하였다.

 

 name이라는 변수에 입력한 문자열을 저장한다.

그리고 print name을 통해 내가 입력한 문자열을 출력한다.

 

 결과 : 입력한 정수 a와 b를 자동으로 곱셈 계산하여 주는 코딩

1. 입력한 문자열변수 x에 저장

2. 문자열 x를 "정수형" 변수 a에 저장

=> 중요한 듯. 일반 문자열 -> 정수형으로 저장하는 과정

3. 입력한 문자열을 변수 x에 저장

4. 문자열 x를 "정수형" 변수 b에 저장


print를 통해 a와 b를 곱한 값을 출력


 

 드디어 새로운 모듈을 호출하기 시작했다.

time이라는 모듈. 뭐하는 건지 아직 자세히는 모른다.

일단 변수에 어떤 값을 저장하는 것이 아니다.

어떤 문자열을 입력하더라도 변수에 무언가 저장되는 것은 아니다.


엔터만을 받아들인다고 보면된다.


그래서 내가 입력한 "2번의 엔터" 행위의 시간을 계산해주는 게임

실제 시간과 내가 예측하여 입력한 값을 비교할 수 있게 해주는 게임



파이썬은 아직까지는 크게 어려운 점 없이 이해를 할 수 있다.

관심이 없을 시절 C언어를 처음으로 접하여 학습하던 때에는 무척이나 어렵게 느껴졌는데, 어디까지나 이루어낼 수 있을지는 미지수 이지만, 도전해 본다.


최근 두 달 동안 2개의 나름 뿌듯한 자격증 2개를 취득하면서 자신감이 붙은 

것 같다. 해낼 수 있다는.







Python 공부를 마음먹고 시작했다. 사실 이전에도 설치는 정말 여러번했다. 이번에는 제대로 공부해보려고 한다.

요 며칠 입력해가며 테스트 했던 파이썬 코드들이다.

##모든 언어의 시작은 Hello라고 한다. 예전에는 Hello World!였었지...

반갑다 파이썬, 오늘 블로그는 노트북의 터치패드로 마우스를 대신하니

편집이 굉장히 번거롭다^^




 

 import turtle

-> turtle이라는 모듈(추가 기능, 정의된 사전 기능 정도로 이해를 하자.)을 사용하겠다고 선언한다.

as t

여기서 turtle이라는 모듈을 불러왔을 때 turtle을 t로 간략하게 입력하여 사용할 수 있도록 정의 한다.


아래의 "t.XXXXXXX" 들은 turtle이라는 모듈에서 추가적인 정의된 명령어(함수)를 사용하겠다는 의미이다.


여기서 forward는 앞으로 전진이며, left는 왼쪽으로 120도(각도)를 의미한다. 

즉 위의 부분은 빨간색으로 삼각형을 그린다.


아래의 green부터는 녹색으로 사각형을 그리는 것이다.




 

 #간단하게 더하기 / 곱하기 / 나누기 / 지수승 / 나머지 값을 구하는 값이다. 여기까진 쉽다. 




 

 역시 turtle 모듈을 불러와 t로 사용하기로 정의했다.

그리고 변수를 배우기 시작했다.


여기서 f라는 변수에 100이라는 값을 입력하고

이동 거리를 숫자 100이 아닌 f로 주어 f에 저장된 값만큼

이동하도록 테스트 한다.

물론 하단의 left도 당연히 변수로 지정하여 값을 대체 하는 것이 되겠지...



 

반복문이 시작되었다. 나의 대학생활 코딩은 for에서 멈췄었는데...이번에는 그 벽을 넘어야지..

Hello!를 10번 출력한다.


 

 

x라는 변수에 range(범위) 3이라는 값을 넣었고 
아래의 값들을 3번 반복하는데
포인트는 300을 출력하는 위치는 자리수가 달라
100
200을 세번 출력 후 
다음 줄에 300을 출력한다.



 

 그래서 자릿수를 맞춰서 출력하는걸 테스트 해봤다.

이건 예제 책자에 없다. 나는 응용하고 싶다.

"기초"로 배운 것을.



 

 자, 변수와 반복문의 섞이기 시작했다.

- 위의 3의 변수는 x에 넣고 for문에 의해 3번 반복되는데
그것은 하단의 t.모듈로드에 의해 120도 각도로 한 변이 100 짜리인 삼각형이 완성된다.

당연히 그 하단은 사각형이 되겠지?




 

 원래 이건 1~10까지 55가 계산되고,

이번의 s값이 무엇인지를 출력하는 것이다.

위에 Original이라는 의미로 붙였다. 사실 아래에 있어서 의미없지만 공부할겸 붙여봤다. 이번에 실행되는 S가 몇 번째인지 구분 하기 위해서.

X에 몇번째인지 입력되고 s에 지속적으로 합산되는 숫자가 출력




 

 

shape는 모양을 바꾸는 것이다.
삼각형과 사각형을 각각의 크기로 그릴때
화살표와 거북이 모양으로..
그냥 뭐 학습정도로...



 

 

이건 내가 그냥 책자에 있는 함수? 들을 보며 만들어봤다.
여러 색상과 펜의 굵기를 조절하고, 장난 질 쳐봤다.



 

 이거는 n의 값을 바꿔가면서 선을 그리는 거였다.

t.fd()의 숫자 값이 클수록 선이 길어진다.

그리고 n의 값이 커질수록 각도 변화가 일어난다.

n의 값과 fd의 값이 같이 커지면 난감..창을 벗어나서 그려버린다.




 

 어제까지의 테스트의 마지막.

80 짜리 지름의 원을 파란 바탕에 흰색으로 

speed(0) 최대 빠른 속도로 그린다.

여기서 원이 조금씩 움직이면서 겹쳐지며 그려져

만들어지는 코딩.

여기까진 아직은 쉽다.







+ Recent posts