2020년 7월 20일 월요일

파이썬의 특이한 튜플 (tuple) 데이타형

파이썬만의 특이한 데이타형이 있는데 바로 튜플(tuple)이라는 것이 있습니다.

형태를 보면 아주 리스트형과 비슷합니다. 하지만 몇가지 면에서는 조금 다른 재미있는 데이타형입니다.

리스트는 []를 사용하여 정의하는데요. 반면 튜플은 ()를 사용하여 정의합니다.

그리고 또다른 점은 리스트는 그 멤버들의 값을 변경할 수가 있는데, 튜플은 한번 정의하면, 그 멤버의 겂을 변경할 수가 없습니다.

튜플을 정의하는 방법은 아래 소스와 같습니다.

a1 = ()
print ("비어있는 tuple - tuple a1 ", a1)

a2 = (1,)
print ("원소가 하나만 있는 tuple - tuple a2 ", a2)

a3 = (1, 5, 3)
print ("원소가 여러개인 tuple - tuple a3 ", a3)

a4 = 1, 3, 9
print ("원소가 여러개인 tuple (괄호 없이 정의) - tuple a4 ", a4)

a5 = ('a', 'b', ('a', 'b'))
print ("원소가 문자이면서 여러개인 tuple - tuple a5 ", a5)

그리고 이 소스의 실행 결과는 아래와 같습니다.

비어있는 tuple - tuple a1  ()
원소가 하나만 있는 tuple - tuple a2  (1,)
원소가 여러개인 tuple - tuple a3  (1, 5, 3)
원소가 여러개인 tuple (괄호 없이 정의) - tuple a4  (1, 3, 9)
원소가 문자이면서 여러개인 tuple - tuple a5  ('a', 'b', ('a', 'b'))

다른 부분은 거의 리스트형과 비슷하지만 4번째 부분이 아주 특이합니다. 괄호없이 그냥 원소들을 나열하기만 해도 듀플로 정의된다는게 신기합니다.

2020년 7월 16일 목요일

Brute Force Attack

많은 악성코드의 유형과는 달리 Brute Force Attack은 웹사이트의 취약점에 의존하지 않는 공격입니다. 대신 이 공격은 취약하거나 추출 가능한 자격 증명을 가진 사용자를 목표로 합니다. Brute Force Attack은 단순하면서도 많은 표적을 겨냥할 수 있습니다.

Brute Force Attack은 대상에 대해 많은 양의 조합을 시도하면서 시작됩니다. 이러한 공격은 종종 하나의 암호가 유효하기를 희망하면서 계정 암호를 여러번 시도합니다. 가능한 모든 조합을 시도하는 것과 비슷합니다.

암호만이 무차별 공격의 대상이 아닙니다. 링크와 디렉토리, 사용자 이름 및 이메일은 또다른 일반적인 대상입니다.

Brute Force Attack의 목적은 다른 사용자에게는 접근금지되어 있는 리소스에 액세스하는 것입니다. 이것은 관리 계정, 암호로 보호된 페이지일 수 있거나 단순히 주어진 웹사이트에서 유효한 전자 메일을 열람하기 위한 것일 수 있습니다.

유효한 계정에 액세스하면 전체 사이트가 손상될 수 있으며 이는 악의적인 행위자가 손상된 웹사이트 네트워크의 일부로 사용할 수 있습니다.

가장 일반적인 유형의 Brute Force Attack은 사전 공격 (Dictionary Attack)이며 일반적으로 관리 사용자 이름 및 암호를 사용하여 관리 계정에 액세스하여 자격 증명 목록을 포함합니다.

일반적인 사전 공격 (Dictionary Attack) "admin" "123456"과 같이 가장 일반적으로 사용되는 자격 증명으로 로그인을 시도합니다.

Brute Force Attack 시도를 식별하는데는 상식이 중요합니다. 기본적으로 누군가가 반복적으로 로그인에 실패한 것으로 보이는 경우 Brute Force Attack 시도일 가능성이 있습니다. 아래의 경우가 그런 경우입니다.

▶ 동일한 IP 주소가 여러번 로그인에 실패했습니다.
▶ 하나의 계정으로 로그인하려는 많은 다른 IP 주소가 실패했습니다.
▶ 단기간에 다양한 IP 주소에서 여러번 로그인에 실패했습니다.

Brute Force Attack은 봇넷에 사용자를 추가하여 DDoS 공격에 포함시킬 수 있는 방법도 있습니다. 다른 예로는 공격자가 웹 사이트를 손상시키기 위해 자격 증명을 무력화하는 방법이 있습니다.

웹사이트에서 관리 계정에 액세스하는 것은 심각한 취약점을 악용하는 것과 같습니다. 해커는 스팸을 추가하거나 맬웨어를 배포하거나 의심하지 않는 피해자를 피싱하는 등 액세스를 통해 이익을 얻으려고 시도합니다.

기본적으로 Brute Force Attack은 가능한 많은 조합을 시도하는 행위이지만 성공률을 높이기 위해 이 공격에는 여러가지 변형이 있습니다. 가장 일반적인 것은 다음과 같습니다.

▶ 간단한 무차별 대입 공격

일반적인 Brute Force Attack은 한번에 하나씩 가능한 모든 암호를 반복하는 것과 같은 다양한 방법을 사용할 수 있습니다. 다른 공격들도 성공률이 높은 시도 횟수에 제한이 없는 로컬 파일에서 일반적으로 사용됩니다.

Dictionary Attack

이 공격은 무작위로 들어가지 않고 단어와 일반 암호 목록을 사용하여 가능한 암호의 "사전"을 작성하고 반복합니다. 좋은 암호 목록을 사용하면 공격자의 성공률을 높이는데 도움이 될 수 있지만 이러한 공격에는 종종 가능성이 많은 대상에 대한 많은 공격 시도가 필요합니다.

Hybrid Brute Force Attack

하이브리드 공격은 사전 공격과 규칙적인 반복 패턴을 모두 사용합니다. 문자 그대로 모든 암호를 사용하는 대신 숫자를 추가하거나 대소 문자를 변경하는 등 사전의 단어를 약간 수정합니다.

Credential Stuffing

데이터 유출이 증가함에 따라 비밀번호 재사용은 비밀번호를 재사용하는 특정 계정을 손상시키는 쉬운 방법입니다.

Credential Stuffing 공격은 성공률이 낮으며 주로 데이터 유출에서 일반적으로 발견되는 사용자 이름 및 비밀번호 목록에 의존합니다. 해커는 이 목록을 사용하여 도난된 자격 증명으로 로그인을 시도하며, 데이터가 유출되었다고 생각될때 사용자 이름과 비밀번호를 업데이트해야 합니다.

Brute Force Attack에 대해서는 보안 취약점의 헛점을 노리는 것이 아니기 때문에 소프트웨어를 최신 상태로 유지하는 것만으로는 자신을 보호할 수 없습니다. 이러한 공격을 방지하는 일반적인 방법은 다음과 같습니다.

▶ 강력한 비밀번호 사용

Brute Force Attack는 취약한 비밀번호에 의존합니다. 강력한 암호를 위해서는 여러 사이트에 같은 암호를 사용하지 않아야 하며, 가능한한 긴 암호를 사용해야 합니다. 그러면서도 쉽게 유추가능한 암호는 피해야 합니다. 자신의 이름이나 거주 도시와 같은 정보가 암호를 기억하기 쉽게 만들 수 있지만 누군가가 사용자에 대한 정보를 얻거나 추측하기가 더 쉽습니다.

이러한 방식으로 암호를 설정한다면 Brute Force Attack은 암호를 추측할 수 없으므로 안전합니다.

암호찾기 질문에도 동일한 원칙이 적용됩니다. 암호는 강력하지만 암호찾기 질문이 약하면 공격자는 기존 암호를 추측하지 않고 바로 새로운 암호로 재설정하기가 쉽습니다.

▶ 인증 URL에 대한 액세스 제한

Brute Force Attack의 사전 조건은 자격 증명을 보내는 것입니다. 로그인 페이지 URL을 변경하면 ( : /wp-login.php에서 / mysite-login으로 이동) 대부분의 자동화된 대량 도구를 중지하기에 충분할 수 있습니다.

안타깝게도 이 제안은 링크가 추측 가능하거나 링크가 페이지에 표시되는 경우 고급 공격에는 적용되지 않습니다. 하지만 자동 공격을 방지하는 쉬운 방법입니다.

▶ 로그인 시도 제한

Brute Force Attack은 여러 개의 비밀번호와 계정을 시도합니다. 로그인 시도수를 제한함으로써 공격자는 여러가지 암호 시도를 할 수가 없습니다.

로그인 시도를 제한하는 일반적인 방법은 5번의 로그인 시도 실패후 IP 로그인이 일시적으로 금지되어 로그인 시도가 차단되는 것입니다.

▶ 보안 문자 사용

보안 문자는 봇 및 자동화된 도구가 웹사이트에서 로그인을 시도하기 전에 보안문자를 입력해야만 하게 하면 웹사이트에서 작업을 수행하지 못하게 하는 좋은 방법입니다. 보안문자는 사용자가 읽어 입혁해야 하기 때문에 로봇이 공격을 하기가 어렵게 만듭니다.

▶ 이중 인증 사용 (Two-Factor Authentication : 2FA)

2FA는 로그인 양식에 다른 보안 계층을 추가합니다. 적절한 자격 증명으로 로그인한 후에는 이메일 또는 인증 도구로 생성된 고유 코드와 같이 사용자만 액세스 할 수 있는 코드를 입력해야 합니다.

이 추가 계층은 자격 증명을 성공적으로 얻은 사람이 보조 인증없이는 계정에 액세스하지 못하게 합니다.

2020년 7월 15일 수요일

파이썬 continue와 break 사용법

파이썬에서도 C 언어의 continue break와 똑같은 키워드를 지원하는데요.

사용법은 C 언어와 동일합니다.

아래는 continue 사용에 대한 소스인데요. continue를 만나면 while loop의 마지막까지 모든 실행문을 건너뛰게 됩니다.

a = 0

while (a < 5):
    a = a + 1
    if (a == 4):
        continue
    print ("a : ", a)

아래는 위의 소스의 실행 결과인데요. a 4이면 아래의 print문을 건너뛰고 while문의 맨위로 가게 됩니다. 결국 a 4일때는 print 결과가 나오지 않게 됩니다.

a :  1
a :  2
a :  3
a :  5

아래는 break의 사용에 대한 소스인데요. continue와 달리 break while문을 빠져 나가게 합니다.

a = 0

while (a < 5):
    a = a + 1
    if (a == 4):
        break
    print ("a : ", a)

아래의 결과를 보면 a 4이면 바로 while문을 나가 종료하게 되고 a 3일때까지만 실행됩니다.

a :  1
a :  2
a :  3

2020년 7월 14일 화요일

화이트 박스 암호화 (White Box Cryptography)

암호화는 개방형 장치 ( : PC, 태블릿 또는 스마트폰)에서 실행되는 응용프로그램에 점점 더 많이 적용되고 있습니다. 공격자가 실행 플랫폼과 소프트웨어 구현 자체를 완벽하게 제어할 수 있을 가능성이 많기 때문에 이러한 시스템의 개방성은 소프트웨어가 공격에 매우 취약하게 됩니다. 이는 공격자가 응용프로그램의 이진 코드와 해당 메모리 페이지를 실행하는 동안 쉽게 분석할 수 있음을 의미합니다. 침입자는 IDA Pro, 디버거, 에뮬레이터 등과 같은 모든 종류의 공격 도구를 사용하여 시스템 호출을 가로채서 바이너리와 그 실행을 변조할 수 있습니다. 이러한 공격 컨텍스트는 화이트 박스 공격 컨텍스트라고 합니다.

화이트 박스 암호화가 해결해야 할 과제는 화이트 박스 공격을 받을 때에도 암호화 자산이 안전하게 유지되는 방식으로 소프트웨어에서 암호화 알고리즘을 구현하는 것입니다. 따라서 화이트 박스 암호화 (WBC)는 모든 소프트웨어 보호 전략에서 필수적인 기술입니다. 이 기술을 사용하면 암호화 키와 같은 기밀 정보의 일부를 공개하지 않고도 암호화 작업을 수행할 수 있습니다. 이것이 없으면 공격자는 바이너리 (메모리) 에서 비밀 키를 쉽게 얻거나 실행시 공개로 이어지는 정보를 가로챌 수 있습니다.

WBC는 주어진 암호를 강력한 표현으로 바꾸는 특수 목적 코드 생성기로 볼 수 있습니다. 비밀 키의 조작이 임의의 데이터 및 코드와 결합되어 임의의 데이터를 키 정보와 구별 할 수 없게 합니다.

아래 그림은 고정 키 구현의 경우 WBC에 대한 개념적 상위 레벨 개요를 보여줍니다. 이러한 구현에서, 키는 코드에 하드코딩될 것입니다. 화이트 박스 변환은 코드에 포함된 키를 추출하기 어려운 애플리케이션의 코드를 생성하는 것입니다.

2020년 6월 29일 월요일

Credential Stuffing Attack

M8gu96mB76 Netflix 비밀번호로 설정한 다음 Amazon, New York Times 가입 및 은행 계좌의 비밀번호로 재사용한다고 가정해 보겠습니다. 해커가 이러한 시스템중 하나에 침입하여 암호를 얻으면 암호를 사용하여 나머지 모든 시스템에 액세스 할 수 있습니다.

Credential Stuffing 공격은 계정 탈취의 한 형태이며, 그 결과는 불편함 (계정에서 가입자를 잠그는 Disney + 해킹에서와 같이)에서 혼란스럽고 사악한 범죄 ( : 해커가 홈카메라로 침입하여 어린이를 몰래 감시)에 이르기까지 다양합니다.

Credential Stuffing 공격이 일반적으로 작동하는 방법은 다음과 같습니다.

1 단계 : 해커가 사용자 이름과 비밀번호가 포함된 데이터베이스에 액세스합니다. 이 초기 사이버 공격은 정교한 해킹에서부터 데이터베이스에 대한 액세스 권한이 있는 관리자에 대한 피싱 공격, 공개적으로 액세스할 수 있는 영역에 남겨진 보호되지 않은 레코드에 이르기까지 다양한 방식으로 발생할 수 있습니다.

2 단계 : 해커는 이 정보를 복사하여 다른 해커가 사용할 수 있도록 정보를 판매하거나 게시합니다 (일반적으로 다크웹에 게시).

3 단계 : 사이버 범죄자는 한 사이트의 사용자 이름과 비밀번호를 사용하여 다른 사이트에 액세스하려고 시도합니다. 성공률은 상대적으로 낮기 때문에 해커는 자동화에 의존합니다. 봇넷은 액세스 권한을 부여할 때까지 수백만개의 사용자 이름-암호 조합을 시도합니다.

해커가 피해자 사이트에 액세스하면 다양한 형태의 장난을 일으킬 수 있습니다. 다음은 가장 일반적인 3가지입니다.

손상된 계정에 대한 액세스 판매 : 특히 스트리밍 미디어 서비스에 일반적입니다. Disney+, Netflix Spotify는 해커가 구독 비용보다 적은 비용으로 사용자 계정에 대한 액세스 권한을 판매한 공격의 피해자입니다.

전자 상거래 사기 : 해커는 소매 웹사이트에서 합법적인 사용자를 사칭하여 사용 또는 재판매를 위해 고가의 제품을 주문할 수 있습니다. 이것은 일반적인 신원 도용의 형태로, 소매업은 자격증 소지에 가장 취약한 업종입니다.

회사 및 기관 도용 : 위의 2가지는 회사와 고객에게 심각한 결과를 초래하지만 이 공격은 비즈니스에 가장 치명적일 수 있습니다. 공격자가 직원이나 관리자의 계정을 도용하면 모든 종류의 민감한 내부 데이터에 액세스하여 최고 입찰자에게 판매할 수 있습니다. 당연히, 손상된 데이터에는 사용자 이름 및 비밀번호 데이터베이스가 포함될 수 있습니다.

2020년 6월 27일 토요일

파이썬의 input()을 사용한 입력방법

다른 프로그래밍 언어와 마찬가지로 파이썬에서 키보드를 통해 어떤 숫자나 문자열을 입력받을 수 있습니다. 그때 사용하는 구문이 "input()"입니다. Input()내에 입력할 때 의미를 잘 알 수 있도록 여러가지 문장도 추가가능합니다.

아래 소스가 input()을 활용한 소스 코드입니다.

a = input('점수를 입력하세요 : ')
print ("입력한 점수는 ", a, " 입니다")

if a < 100:
    print ("입력한 점수는 100보다 작다 : ", a)
elif a > 100:
   print ("입력한 점수는 100보다 크다 : ", a)
else:
   print ("입력한 점수는 100과 같습니다 : ", a)

그런데 위의 소스를 실행하면 아래와 같이 에러가 발생됩니다.

점수를 입력하세요 : 100
입력한 점수는  100  입니다
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    if a < 100:
TypeError: '<' not supported between instances of 'str' and 'int'

그 이유는 파이썬의 input()로 입력받은 결과값은 문자열 형태이기 때문입니다. C언어에서도 숫자나 문자열을 입력받는 방법이 조금 다르죠. 그 해결방법은 입력받은 문자열을 필요한 다른 데이터 타입으로 변환시켜야 합니다.

다음의 소스를 보시면 input()int()를 사용해서 문자열을 정수로 변환시킵니다. 만약 실수형으로 변환하려면 float()를 사용하면 됩니다.

a = int( input('점수를 입력하세요 : ') )
print ("입력한 점수는 ", a, " 입니다")

if a < 100:
    print ("입력한 점수는 100보다 작다 : ", a)
elif a > 100:
   print ("입력한 점수는 100보다 크다 : ", a)
else:
   print ("입력한 점수는 100과 같습니다 : ", a)

위의 소스를 실행하면 아래와 같이 제대로 실행됨을 알 수 있습니다.

점수를 입력하세요 : 100
입력한 점수는  100  입니다
입력한 점수는 100과 같습니다 :  100


2020년 6월 26일 금요일

HDCP (High-Bandwidth Digital Content Protection)

영화나 TV를 시청할때 시청하는 콘텐츠는 보호되어야 하고 이러한 보호는 저작권법으로 정의되어 있습니다. 저작권 침해는 책이나 영화와 같은 저작물이 허가없이 사용될때 발생합니다. 저작물을 표시, 배포 또는 복제할 수 있는 권리는 디지털 또는 서면 컨텐츠의 저작권 보유자에게 부여됩니다. 허가없이 이러한 저작물을 사용하면 해당 권리가 침해되고 제작자 또는 소유자에게 손해를 끼치게 됩니다.

이 문제를 해결하기 위해 개발된 HDCP는 고대역폭 디지털 컨텐츠 보호 (High-Bandwidth Digital Content Protection)를 말하며, 콘텐츠 제작자와 배포자를 디지털 불법 복제로부터 보호하기 위해 설계된 DRM (Digital Rights Management)으로서 복사 방지 방식으로 영상 소스와 디스플레이 사이의 디지털 데이터 스트림을 가로챌 가능성을 제거합니다. 비디오 및 오디오가 제공되기 전에 인증 및 키 교환 절차 등이 정의되어 있습니다. DVD 플레이어, 위성 및 케이블 HDTV 셋톱 박스와 같은 HDCP 체계와 호환되는 제품은 호환되는 디스플레이에 연결해야 합니다. 장비에 HDCP를 사용하는 제조업체가 증가함에 따라 HDCP 호환 HDTV를 구매하는 것이 권고됩니다.

HDCP 암호화를 사용하는 디지털 (DVI 또는 HDMI) 연결을 통해 720p / 1080i / 1080p 등의 해상도들이 지원됩니다.

HDCP 세션에서 영상 소스와 디스플레이 장치간에 키가 교환되는데, 소스 장치는 비디오를 표시하기 전에 장비가 HDCP를 준수하는지 확인하기 위해 디스플레이를 확인합니다. PC 및 구형 DVI 제품과 같은 HDCP를 지원하지 않는 장치는 모든 DVI 호환 디스플레이에서 작동하지만 HDCP 호환 상자는 HDCP 호환 디스플레이에서만 이미지를 표시합니다.

HDCP의 영향을 받는 다른 제품으로는 스케일러 (Scaler), 스위처 (Switcher) 및 분배 앰프 (Distribution Amp)가 있습니다. 이러한 장치는 키 교환에 대한 인증을 하지 않지만 비디오가 어떤 방식으로든 처리되는 경우 HDCP의 존재를 전송할 수 있어야 합니다. 서로 다른 두가지 형식의 디지털 연결로 인해 적절한 통신이 불가능할 경우 상호 운용성이 상실될 수 있습니다.

다음은 DVD 플레이어에서 영화를 재생할때 HDCP 라이센스 장치에서 발생하는 하나의 예입니다.

DVD를 컴퓨터에 넣은후 송신기는 수신기 (컴퓨터) HDCP 키 컨트롤이 있는 올바른 라이센스가 있는지 확인합니다.
컴퓨터에 올바른 라이센스가 없으면 콘텐츠 데이터를 받지 않으며 HDCP 암호화 데이터를 표시할 수 없습니다.
컴퓨터에 HDCP 컨트롤이 있으면 동영상이 컴퓨터 화면에 표시됩니다.

이 프로세스는 영화를 볼때만 발생한다고 생각할 수 있지만 송신기는 시청하는 동안 지속적으로 HDCP 라이센스를 확인합니다. 한편, 다른 수신자가 콘텐츠를 훔치거나 보지 못하게 할 수도 있습니다.

아래는 간략하게 정리된 HDCP 연결 구성도입니다.

2020년 6월 24일 수요일

파이썬의 조건문 if, else, elif

다른 프로그래밍 언어와 마찬가지로 파이썬에서도 거의 비슷한 구문을 지원하는데, 바로 if, else,elif입니다.

간단한 샘플 코드를 보면 이해하기 쉬울거 같습니다.

a = 100
print ("a는 ", a)

if a == 100:
   print ("a는 100이다 : ", a)
else:
   print ("a는 100이 아니다 : ", a)


한가지 조건일 경우에는 "if ~ else ~"로 코드를 작성하면 됩니다. 아래는 위의 코드의 실행 결과입니다.

a는  100
a는 100이다 :  100


조건을 2개 이상일 경우에는 "if ~ elif ~ ... else"를 사용하면 됩니다.

a = 100
print ("a는 ", a)

if a < 100:
    print ("a는 100보다 작다 : ", a)
elif a > 100:
   print ("a는 100보다 크다 : ", a)
else:
   print ("a는 100이다 : ", a)


위의 코드의 실행 결과는 아래와 같습니다.

a는  100
a는 100이다 :  100

2020년 6월 23일 화요일

RPMB (Replay Protection Memory Block)

EMMC, UFS 및 NVMe와 같은 스토리지 기술은 범용 프로토콜 및 프레임 레이아웃을 가진 RPMB 하드웨어 파티션을 지원합니다.

RPMB 파티션은 표준 블록 계층을 통해 액세스할 수 없지만 WRITE, READ, GET_WRITE_COUNTER 및 PROGRAM_KEY와 같은 특정 명령 세트를 통해 액세스할 수 있습니다.
이러한 파티션은 인증 및 재생 보호 액세스 (Replay Protected Access)를 제공하므로 보안 스토리지로 적합합니다.

RPMB 계층은 Block Frame Signature을 안전하게 계산할 수 있는 TEE (Trusted Execution Environment) 장치를 위한 API를 제공합니다.

TEE (Trusted Execution Environment) 장치가 재생 보호 (Replay Protection) 데이터를 저장하고자 하는 경우, 요청된 데이터로 RPMB 프레임을 생성하고 프레임의 HMAC를 계산한 다음 RPMB 계층을 통해 저장 장치에 데이터를 저장하도록 요청합니다.

일반적으로 RPMB 파티션에 액세스 (예 : 읽기 또는 쓰기)하기 전에 RPMB 인증 키를 eMMC / UFS 또는 NVMe 장치의 RPMB 컨트롤러에 프로그래밍해야 합니다.

이 키는 한 번만 프로그래밍해야 하며 (최소한 RPMB 사양에 따라) 프로그래밍 명령 / 요청에서 RPMB 키를 일반 텍스트로 보내야 하므로 일반적으로 안전한 환경에서 프로비저닝해야 합니다. 예를 들면 공장 제조 라인 또는 eMMC / UFS / NVMe를 교체한후 현장의 신뢰할 수 있는 펌웨어 환경을 말합니다.

프로그래밍후 이 RPMB 키도 잘 보호해야 하므로 일반적으로 RPMB 사용시 OP-TEE, Google Android Trusty 또는 x86 Intel 플랫폼용 TEE (신뢰할 수 있는 실행 환경)가 제공됩니다. 그러나 이러한 TEE 환경에는 일반적으로 RPMB 드라이버가 없으며 이 키를 보호를 위해 TEE (또는 안전한 세계) 내에 안전하게 유지하는 반면, RPMB 드라이버 자체는 일반적인 비보안 환경에 있어야 합니다.

그런 다음, TEE는 RPMB 키를 사용하여 RPMB 데이터에 서명하고 HMAC-SHA256 인증 서명 (MAC)과 함께 RPMB 데이터를 Linux over IPC (보안 세계 TEE 및 secure world Linux)로 보냅니다. Linux 커널 드라이버는 인증 쓰기를 위해 해당 데이터 조각 (RPMB 프레임)을 RPMB 물리적 장치로 함께 전송하는 책임을 집니다.


REPLAY 보호와 관련하여 읽기 / 쓰기 액세스를 위해 다음과 같이 달성할 수 있습니다. 스토리지 컨트롤러 H/W 내장 쓰기 카운터 (Write Counter)가 쓰기 액세스에 대한 재생 보호에 사용됩니다. 인증 쓰기 (Authenticated Write)가 성공할 때마다 H/W 쓰기 카운터 (Write Counter)는 1씩 증가합니다 (처음에는 0임). 쓰기 카운터 (Write Counter)는 절대 감소하지 않으므로 재생 쓰기 액세스 (Replayed Write Access)는 거부됩니다. 이렇게 하면 데이터가 최신 상태를 유지할 수 있지만 카운터가 최대값 (32 비트)에 도달하면 모든 쓰기 액세스가 거부되는데, 이때 RPMB는 읽기 전용 스토리지가 됩니다.

소프트웨어 생성 난수 (nonce)는 읽기 액세스에서 재생 방지 (Replay Protection)에 사용되지만, 읽기 액세스에서는 TEE의 소프트웨어가 데이터를 인증하고 확인할 책임이 있으므로 데이터 재생을 방지하기 위해 동일한 난수 또는 허술한 무작위 난수를 사용해서는 안됩니다.

2020년 6월 9일 화요일

파이썬 for문의 다양한 반복 범위 지정 - list 구조체 활용

일반적으로 for문에서 정해진 범위만큼 반복하게 하는 것은 1씩 증가 또는 어떤 간격으로 반복하게 하는 것인데, 파이썬에서는 list 구조체를 활용하여 다양하게 범위를 지정할 수 있네요.

무척 재미있는 프로그래밍 언어인거 같습니다.

아래 소스를 보면 list 구조체 개수만큼 반복합니다.

for num in [0, 7, 5, 2, 10]:
   print (num)


실행시키면 인덱스 0부터 4까지 반복하면서 그 값을 출력하는 간단한 소스입니다.

0
7
5
2
10


list 구조체의 멤버가 문자열인 경우에도 아래와 같이 사용할 수 있습니다.

for s in ['Apple', 'Grape', 'Orange', 'Pepper']:
   print (s)


실행결과를 보면 참 재미있네요

Apple
Grape
Orange
Pepper


list 변수를 사용해도 됩니다. 아래 소스를 실행하면

s = ['Apple', 'Grape', 'Orange', 'Pepper']

for s in s:
   print (s)


아래와 같이 나옵니다.

Apple
Grape
Orange
Pepper


그리고 문자열은 문자들이 이어진 것이고 문자들이 모인 list 구조체라 생각할 수 있으므로 아래 소스와 같이 활용할 수 있습니다.

for s in 'Apple':
   print (s)


그러면 문자열내의 문자 하나씩 출력됩니다.

A
p
p
l
e

2020년 6월 5일 금요일

파이썬 list 구조체의 특정 위치의 멤버를 뽑아내기 - pop

list 구조체내의 여러 멤버들중 특정 위치에 있는 멤버만 뽑아내는 방법인데요.

이전의 remove와는 비슷한듯 하지만 조금 다릅니다.

remove는 어떤 값이나 문자열을 가진 멤버를 삭제하는 반면, pop은 인덱스 기준으로 뽑아냅니다.

그러면서 해당 인덱스에 있던 멤버의 값이나 문자열을 리턴시킵니다.

아래 소스가 그 예입니다.

list1 = [1, 5, 3, 9, 5]
print ("원래 list1 : ", list1)

print ("인덱스 3을 pop : ", list1.pop(3))
print ("pop 실행후 list1 : ", list1)


인덱스 3인 위치의 멤버 pop하면 해당되는 멤버의 값인 '9'가 리턴되고, list1은 마치 remove한 결과를 보여줍니다.

아래에 실행 결과가 있습니다.

원래 list1 :  [1, 5, 3, 9, 5]
인덱스 3을 pop :  9
pop 실행후 list1 :  [1, 5, 3, 5]

2020년 6월 4일 목요일

파이썬 list 구조체내의 특정 값을 가진 멤버의 위치 찾기 - index

list 구조체내에 특정 값을 가진 멤버의 위치를 찾는 방법입니다.

참고로 같은 값이 여러 개일때, 제일 빠른 위치의 멤버의 값을 비교하여 찾아 줍니다.

아래 소스를 보시면,

list1 = [1, 5, 3, 9, 5]
print ("list1 : ", list1)

print ("5의 인덱스는 : ", list1.index(5))
print ("5의 인덱스는 : ", list1.index(5))


5가 2개가 있어 위치를 찾아보면 항상 첫번째 위치만 나옴을 알 수 있습니다.

list1 :  [1, 5, 3, 9, 5]
5의 인덱스는 :  1
5의 인덱스는 :  1

2020년 6월 3일 수요일

파이썬 list 구조체내의 원소들을 거꾸로 뒤집기 - reverse


이전 포스트에서 이야기한 list 구조체 정렬시키는데 사용하는 sort는 알파벳 또는 가나다 순으로 순방향 또는 역방향으로 정렬시킬 수 있는데, 여기서 이야기하는 reverse는 그거와는 다른 역순으로 뒤집는 것인데요.

sort와는 달리 말그대로 거꾸로 뒤집는 것이죠.

아래 소스와 실행 결과를 보시면 이해가실 것입니다.

list1 = [1, 5, 3, 9, 5]
print ("원래 list1 : ", list1)

list1.reverse()
print ("거꾸로 뒤집힌 list1 : ", list1)

이 소스를 실행하면

원래 list1 :  [1, 5, 3, 9, 5]
거꾸로 뒤집힌 list1 :  [5, 9, 3, 5, 1]


2020년 6월 2일 화요일

파이썬 list 구조체의 모든 항목을 지우기 - clear 및 기타 방법

파이썬의 list 구조체의 항목수가 적을때는 하나씩 삭제해도 그다지 힘들지 않을텐데, 만약 그 항목수가 많으면 이 방법으로는 힘들겠죠?

clear를 사용하면 쉽게 할 수 있습니다.

list1 = [1, 5, 3, 9, 5]
print ("원래 list1 : ", list1)

list1.clear()
print ("모두 삭제된 list1 : ", list1)


이렇게 하면 한번에 모두 삭제 가능합니다. 아래 실행결과가 있습니다.

원래 list1 :  [1, 5, 3, 9, 5]
모두 삭제된 list1 :  []


그런데 clear를 사용하지 않고도 모두 삭제할 수 있는 방법도 있습니다. 바로 인덱스 범위를 지정해서 del을 사용해도 됩니다.

list1 = [1, 5, 3, 9, 5]
print ("원래 list1 : ", list1)


del list1[0:5]
print ("모두 삭제된 list1 : ", list1)


실행결과는 아래와 같습니다.

원래 list1 :  [1, 5, 3, 9, 5]
모두 삭제된 list1 :  []

그런데 만약 list 구조체의 항목수를 정확히 모르면 (프로그램 실행중에 추가 및 삭제 등이 빈번해서), 정확한 인덱스를 모르겠죠? 그러면 아래와 같이 하면 됩니다. 물론 list 구조체의 크기를 알아내는 방법이 있기는 하겠죠.

list1 = [1, 5, 3, 9, 5]
print ("원래 list1 : ", list1)

del list1[:]
print ("모두 삭제된 list1 : ", list1)


역시 마찬가지로 아래와 같이 동일한 실행결과를 볼 수 있습니다.


원래 list1 :  [1, 5, 3, 9, 5]
모두 삭제된 list1 :  []

2020년 5월 29일 금요일

파이썬 list 멤버들의 복사 - copy

파이썬 list 멤버를 다른 list로 복사하는 방법은 아래 코드와 같이 할 수 있을 것인데요.

list1 = [1, 2, 3, 4, 5]
list2 = list1

print (list1)
print (list2)


그러면 아래와 같이 결과가 나옵니다.

list1 :  [1, 2, 3, 4, 5]
list2 :  [1, 2, 3, 4, 5]


그런데 아래 코드를 실행하면

list2[2] = 0

print ("list1 : ", list1)


아래와 같이 나옵니다.

list1 :  [1, 2, 0, 4, 5]

분명 list2의 3번째 멤버의 값을 변경했는데, list1의 3번째 멤버의 값도 같이 바뀝니다.

이유는 list를 저장하는 변수는 실제 값을 가지고 있는게 아니라 list 구조체에 대한 포인터 (주소)를 가지고 있기 때문에 list1이나 list2 모두 같은 구조체의 주소를 가지고 있으므로 list2 구조체 멤버를 변경하면 list1 멤버도 같이 변경되기 때문이죠.

그렇다면 list1과 list2의 주소를 달리하면서 멤버들을 복사하는 방법이 있죠. 바로 copy를 이용하면 되는데요.

다시 코드를 아래와 같이 변경했습니다.

list1 = [1, 2, 3, 4, 5]
list2 = list1.copy()

print ("list1 : ", list1)
print ("list2 : ", list2)

print ("\n")

list2[2] = 0

print ("list1 : ", list1)
print ("list2 : ", list2)


그러면 아래와 같이 완벽히 다른 주소를 가진 list2에 list1의 멤버가 복사되었음을 볼 수 있습니다.

list1 :  [1, 2, 3, 4, 5]
list2 :  [1, 2, 3, 4, 5]

list1 :  [1, 2, 3, 4, 5]
list2 :  [1, 2, 0, 4, 5]

2020년 5월 28일 목요일

mmWave (millimeter Wave)

"밀리미터파"라고 하는 mmWave는 5G가 할 수 있는 것을 실제로 보여주는 단거리 고주파 네트워크 기술입니다. 더 많은 사람들을 위해 더 많은 데이터를 네트워크를 통해 전달할 수 있도록 더 새롭고 더 넓은 통로를 준비하기 위해 필요한 것인 mmWave입니다.

4G LTE 기술은 고속으로 데이터를 전달하며, 이를 통해 통신, 미디어 소비, 생활 관리, 심지어는 타고 다니는 방식을 크게 바꿔 놓았습니다. 그러나 기술이 발전함에 따라 기술을 활용하고 사용할 방법에 대한 기대도 높아졌습니다. 사회가 점점 더 디지털에 의존하게 됨에 따라 가상 현실이든 실시간 설계 프로그램이든 관계없이 미래의 더욱 데이터 집약적인 응용 프로그램의 요구는 데이터 흐름 방식을 근본적으로 재구성해야 합니다.

이를 위해 5G 네트워크는 더 높은 주파수, 특히 밀리미터파 스펙트럼으로 알려진 28 및 39GHz 주파수를 기반으로서비스를 준비해야 합니다. 이러한 주파수는 매우 빠른 속도로 지연 시간이나 지연이 거의없이 대량의 데이터를 전달할 수 있습니다. 따라서 모바일 우선 사용자, 커넥티드 홈, AR / VR 장치, 클라우드 게임 시스템, 자율 주행 차량, IoT 센서 및 기타 클라우드 연결 장치의 데이터 수요가 크게 증가하는데 적합합니다.

mmWave는 더 많은 대역폭을 제공합니다. 초고속 및 더 많은 용량으로 5G의 잠재력을 실현하기 위한 또 다른 단계입니다.

mmWave는 휴대 전화가 모바일 기지국과 통신하여 전화를 걸고 문자를 보내며 데이터를 빠르고 원활하게 실행하는 데 사용하는 주파수 유형에서 잘 알려진 이름에서 유래되었습니다.

mmWave 고주파수는 단거리에 걸쳐 많은 용량과 대역폭을 제공할 수 있는데, mmWave 셀은 기지국에서 수백 미터까지 신호를 전달합니다. 이는 쇼핑 센터와 같은 많은 사용자가 집중된 지역에 가장 적합합니다. 붐비는 도심 기차역과 경기장까지 모두 mmWave의 기능을 활용할 수 있습니다.

현재 5G에서 사용하는 주파수 대역은 Sub-6GHz 밴드로 한국의 경우 SKT는 3.6~3.7 GHz, KT는 3.5~3.6GHz, U+는 3.42~3.5GHz로 주파수 경매된 대역에서 서비스를 하고 있는데, mmWave 주파수 대역에서는 SKT 28.1~28.9GHz, KT 26.5~27.3GHz, U+ 27.3~28.1GHz로 보다 많은 대역으로 할당되어 있습니다. Sub-6GHz 대역에서는 3개사에 280MHz 대역폭이 할당되어 있으나, mmWave 대역에서는 2400MHz 대역폭이 할당되어 있어 진정한 5G 속도를 제공할 것으로 보입니다.

2020년 5월 27일 수요일

파이썬 list 구조체내 특정 멤버 개수를 카운트

파이썬 list 구조체에서는 특정 값을 가진 멤버들의 개수도 알아낼 수가 있네요.

이런 것은 C 언어에서는 하나의 함수를 작성하던지 해야 하는데, 파이썬에서는 아주 간단히 처리할 수 있어요.

아래 코드가 하나의 간단한 예제입니다.

list1 = [4, 7, 2, 6, 6, 9, 7, 3, 2, 4]
print ("원래 List1은 ", list1, " 입니다\n")

print ("4 의 갯수는 ", list1.count(4))
print ("9 의 갯수는 ", list1.count(9))


list1에서 4의 값을 가진 멤버 개수 및 9의 값을 가진 멤버 개수를 출력할 수 있습니다.

원래 List1은  [4, 7, 2, 6, 6, 9, 7, 3, 2, 4]  입니다

4 의 갯수는  2
9 의 갯수는  1


그리고 숫자가 아닌 문자열의 list 구조체에서도 마찬가지로 가능합니다.

아래 코드는 간단한 문자들의 list 구조체입니다.

list1 = ['D', 'G', 'B', 'F', 'F', 'I', 'G', 'C', 'B', 'D']
print ("원래 List1은 ", list1, " 입니다\n")

print ("D 의 갯수는 ", list1.count('D'))
print ("I 의 갯수는 ", list1.count('I'))


그리고 위의 코드의 실행결과는 아래와 같습니다.

원래 List1은  ['D', 'G', 'B', 'F', 'F', 'I', 'G', 'C', 'B', 'D']  입니다

D 의 갯수는  2
I 의 갯수는  1


그럼 아래 코드는 어떨까요?

list1 = ['Da', 'Gb', 'Bc', 'Fe', 'Fh', 'Ij', 'Gh', 'Ca', 'Bi', 'De']
print ("원래 List1은 ", list1, " 입니다\n")

print ("Da 의 갯수는 ", list1.count('Da'))
print ("I 의 갯수는 ", list1.count('I'))


문자열이 정확히 일치해야만 정확한 개수를 출력하네요. 즉 와일드카드로 문자열 검색을 하지 않는군요. 아래 실행결과를 보시면 알 수 있어요.

원래 List1은  ['Da', 'Gb', 'Bc', 'Fe', 'Fh', 'Ij', 'Gh', 'Ca', 'Bi', 'De']  입니다

Da 의 갯수는  1
I 의 갯수는  0

2020년 5월 26일 화요일

파이썬 list 구조체 멤버들의 정렬시키기

새로운 파이썬 list에 대한 기능이 있는데요.

바로 알파벳 또는 숫자 크기순대로 정렬시키는 것입니다.

물론 역으로 정렬시킬 수도 있고요.

list1 = ['Sky', 'Boat', 'Apple', 'Pencil', 'Paper']
print("원래 List1은 ", list1, " 입니다\n")

list1.sort()
print("List1을 정렬하면 ", list1, "와 같이 됩니다\n")

list1.sort(reverse=True)
print("List1을 거꾸로 정렬하면 ", list1, "와 같이 됩니다\n")


sort()에 인자가 없이 사용하면 오름차순으로 정렬이 됩니다.

역으로 정렬시킬려면 reverse=True를 넣어서 정렬시키면 됩니다.

위의 코드를 실행시키면 아래와 같이 나옵니다.

원래 List1은  ['Sky', 'Boat', 'Apple', 'Pencil', 'Paper']  입니다

List1을 정렬하면  ['Apple', 'Boat', 'Paper', 'Pencil', 'Sky'] 와 같이 됩니다

List1을 거꾸로 정렬하면  ['Sky', 'Pencil', 'Paper', 'Boat', 'Apple'] 와 같이 됩니다

Business Email Compromise (BEC) 공격

BEC (Business Email Compromise)는 일반적으로 파트너에게 송금을 정기적으로 보내는 회사 직원을 대상으로 하는 지능형 이메일 사기입니다.

BEC는 손상된 전자 메일 계정을 사용하여 전자 메일 수신자가 회사 정보를 제공하거나 돈을 보내거나 회사 혁신과 기술을 공유하도록 속입니다.

BEC는 전자 메일 수신자의 신뢰를 얻는데 의존하는 사회 공학 기술입니다. BEC의 사이버 범죄자들은 ​​대부분의 사람들이 발신자 이메일 주소를 면밀히 보지않거나 URL에 약간의 불일치를 알아채지 못한다는 것을 알고 있습니다.

친숙하고 긴급하며 전략적인 이메일 문구와 함께 이러한 기술을 사용하면 회사 직원이 BEC 위협을 쉽고 빠르게 인식하기가 어렵습니다.

BEC 사이버 범죄자는 피싱, 스피어 피싱 및 사회 공학을 사용하여 회사 임원, 회계 부서 및 기타 조직의 고위 구성원을 사칭합니다.

BEC의 5가지 유형

가짜 송장 체계

사이버 범죄는 맬웨어나 다른 피싱 기술을 사용하여 회사의 전자 메일 시스템에 침투합니다. 그런 다음 사이버 범죄자는 일반적으로 인보이스 지불 및 송금을 요청하는데 사용되는 직원 이메일 계정을 인수합니다.

사이버 범죄자는 손상된 직원으로부터 다른 직원에게 자금을 이체하거나 특정 계정으로 송장을 지불하도록 요청하는 이메일을 보냅니다. 이메일은 종종 긴급한 톤으로 작성됩니다. 대상 직원은 전자 메일 보낸 사람을 신뢰하고 실수로 사이버 범죄에 연결된 사기 계정으로 자금을 보냅니다.

CEO 사기

사이버 범죄자는 경영진의 이메일 계정을 변조한 다음 이 ID를 사용하여 회사를 도용합니다. 일반적으로 변조된 전자 메일 계정은 실제 계정과 약간 다릅니다 (예 : tomp@widgets.com 대신 tomp@widgets.co).

사이버 범죄자는 이 이메일 주소와 신원을 사용하여 긴급 송금을 요청하는 메시지가 포함된 이메일을 보냅니다. 이메일 수신자는 발신자를 신뢰하며 이메일 주소가 정확한지 다시 확인해야 한다는 느낌이 들지 않습니다. 이메일 수신자는 요청에 따라 자금을 송금하며 송금과 관련된 은행 이름 또는 회사 이름을 확인하지 않습니다.

계정 손상

정통한 피싱 기술을 사용하여 직원의 계정이 해킹됩니다. 사이버 범죄자는 회사 공급 업체, 파트너 및 공급 업체의 직원 연락처 목록을 채굴합니다. 그런 다음 해킹된 계정에서 이 주요 연락처로 이메일이 전송되어 사이버 범죄자가 관리하는 가짜 계정으로 지불이 요청됩니다.

변호사 가장

고객을 대리하는 변호사로 가장한 사이버 범죄자는 직원 또는 CEO를 접촉합니다. 사이버 범죄자는 이 이메일 대화가 시간에 민감하고 기밀로 유지되어야 함을 분명히 합니다. 압박감을 느끼고 그들이 옳은 일을 하고 있다고 생각하면 BEC 피해자는 요청된 자금을 보냅니다.

정통한 사이버 범죄자들은 종종 금요일 오후나 공휴일이 시작되기 전에 이 BEC 체계를 사용합니다. 이메일 수신자가 업무 완수를 서두르고 있다는 사실을 알고 있습니다.

데이터 도난

사이버 범죄자는 하나 이상의 인사팀 구성원의 회사 이메일을 알아냅니다. 이 이메일 주소는 직원, 회사, 파트너 및 투자자에 대한 기밀 정보 요청을 보내는데 사용됩니다. 이 데이터는 나중에 사이버 범죄자가 더 큰 BEC 공격 또는 회사에 대한 고급 사이버 공격의 일부로 사용됩니다.

BEC 공격이 이루어지는 방법

사이버 사기와 범죄의 성격으로 인해 BEC 공격에는 전략적이고 철저한 접근이 필요합니다.

1. 사이버 범죄자는 대상 회사를 조사하는데 시간을 보냅니다. 범죄자는 보도 자료, LinkedIn 프로필, 웹사이트 컨텐츠 및 소셜 미디어 게시물과 같은 공개 정보를 사용하여 주요 직원의 이름과 직함을 수집합니다. 일부 사이버 범죄자들은 ​​여행 계획, 회의 참석 세부 정보, 회사 파트너 및 투자자, 새로운 제품 정보 및 회사에 대한 기본 사실을 찾고 있습니다.

2. 사이버 범죄자는이 정보를 사용하여 피싱 기술을 사용하여 회사 전자 메일 시스템을 해킹하거나 주요 직원의 전자 메일 계정을 변조합니다.

3. 회사 내부에서 사이버 범죄자는 이 이메일 액세스 및 회사에 대해 수집한 정보를 사용하여 범죄에 따라 대응할 것으로 판단되는 직원에게 친숙하고 친근하고 긴급한 이메일을 발송합니다.

4. 의심하지 않는 직원은 사이버 범죄 범죄자로부터 동료, 변호사 또는 회사 파트너로서 지불, 자금 이체 또는 기밀 정보를 요청하는 이메일을 받습니다.

5. 이메일 주소는 친숙하고 요청이 평범하지 않기 때문에 무고한 직원은 두번 생각하지 않고 사이버 범죄 요청과 정확히 동일하게 행동합니다. 일반적으로 직원은 연체된 인보이스를 지불하거나 새로운 회사 파트너에게 자금을 이체함으로써 회사의 최선의 이익을 위해 행동한다고 ​​생각합니다.

BEC 공격을 방지하는 방법

1. 5가지 유형의 BEC 공격에 대해 직원을 교육하고, 무료 피싱 시뮬레이션 도구를 활용하여 BEC 및 피싱 위험을 교육하고 식별시킵니다.

2. 입증된 보안 인식 교육 및 피싱 시뮬레이션 플랫폼을 사용하여 직원에게 BEC 및 사회 공학 위험을 최우선으로 주지시킵니다.

3. 보안 담당자들은 피싱 시뮬레이션 도구를 사용하여 직원 BEC 및 피싱 인식을 정기적으로 모니터링하도록 상기시킵니다.

4. 사이버 보안, BEC 및 사회 공학에 대한 지속적인 커뮤니케이션 및 캠페인을 제공합니다. 여기에는 강력한 비밀번호 정책을 설정하고 이메일, URL 및 첨부 파일 형식으로 발생할 수 있는 위험에 대해 직원들에게 상기시킵니다.

5. 개인 장치의 사용과 회사 네트워크 외부의 정보 공유를 제한하는 네트워크 액세스 규칙을 설정합니다.

6. 모든 응용 프로그램, 운영 체제, 네트워크 도구 및 내부 소프트웨어가 최신 상태이고 안전한지 확인하고, 맬웨어 방지 및 스팸 방지 소프트웨어를 설치합니다.

7. 사이버 보안 인식 캠페인, 교육, 지원, 교육 및 프로젝트 관리를 조직문화로 정착시킵니다.

2020년 5월 25일 월요일

파이썬 list 구조체에 대한 추가적인 연산 - '+', insert, extend, remove

파이썬 list 구조체에 대한 멤버 추가나 삭제에 대한 또다른 방법들이 많네요.

이전에는 단순히 list의 마지막에 추가하거나 특정 위치의 멤버 삭제 방법만 알았는데요.

특정 위치에 삽입하는 방법도 있네요

list1 = [1, 2, 3]
print("List1은 ", list1)
list1.insert(1, 'A')
print("List1은 ", list1)


위의 소스는 인덱스 1의 위치에 'A'라는 새 멤버를 삽입하면서 추가하는 방법입니다. 실행결과는 아래에 있습니다.

List1은  [1, 2, 3]
List1은  [1, 'A', 2, 3]


'+' 연산자를 사용해서 append 효과를 낼 수 있는 방법도 있네요. list1과 list2를 합치는 코드입니다.

list1 = [1, 2, 3]
list2 = ['A', 'B', 'C']
list3 = list1 + list2
print("List1은 ", list1)
print("List2은 ", list2)
print("List3은 ", list3)


실행결과는 아래에 나와 있습니다.

List1은  [1, 2, 3]
List2은  ['A', 'B', 'C']
List3은  [1, 2, 3, 'A', 'B', 'C']


'+=' 연산자로 간단히 코드를 작성할 수도 있네요

list3 += ['가', '나']
print("List3은 ", list3)


실행결과는 아래에 나와 있습니다.

List3은  [1, 2, 3, 'A', 'B', 'C', '가', '나']

extend를 사용해서 list 구조체의 멤버들을 확장할 수 있네요

list1 = [1, 2, 3]
print("List1은 ", list1)
list1.extend(['A', 'B', 'C'])
print("List1은 ", list1)


위의 코드 실행결과는 아래와 같습니다.

List1은  [1, 2, 3]
List1은  [1, 2, 3, 'A', 'B', 'C']


이전 del과 달리 삭제할 값과 일치하는 멤버를 찾아서 삭제하는 방법도 있는데요.

list1 = ['A', 'B', 'C']
print("list1은 ", list1)
list1.remove('A')
print("list1은 ", list1)


이 방법은 아주 유용할거 같네요. 'A'와 일치하는 멤버만 삭제되었네요.

list1은  ['A', 'B', 'C']
list1은  ['B', 'C']


만약 아래와 같이 'A'가 2개가 있을 경우에는 어떨까요?

list1 = ['A', 'B', 'C', 'A']
print("\nlist1은 ", list1)
list1.remove('A')
print("\nlist1은 ", list1)


실제 실행해보니 첫번째 'A'만 하나 삭제되는군요.

list1은  ['A', 'B', 'C', 'A']
list1은  ['B', 'C', 'A']