동아리

9) 암호와 네트워크 해킹, 컴퓨터 구조 정리

hyeeej 2026. 5. 29. 23:42

1. 암호

암호 기본 개념

  • 평문(Plaintext): 암호화되지 않은 메세지
  • 암호화(Encryption): 평문을 암호문으로 만드는 것
  • 암호문(Cypertext): 암호화된 메세지
  • 복호화(Decryption): 암호문으로부터 평문을 복원하는 것
  • 키(Key, 암호키: Encryption Key): 평문/암호문을 암호화/복호화시키는 암호 알고리즘에 필요한 핵심 가변정보 값
  • 모듈러 연산: 어떤 숫자를 다른 숫자로 나눈 나머지를 구하는 연산
  • 합동: 어떤 숫자를 다른 숫자로 나눈 나머지가 같은 경우, 이를 합동이라 함

 

a와 b를 n으로 나눈 나머지가 같다

= a와 b는 mod n에 대하여 합동이다

ex) -3, 7, 10은 mod 10에 대하여 합동이다

 

  • 인코딩: 데이터를 코드화하고 압축하는 등 다른 형태로 변화하는 것

인코딩 vs 암호화

인코딩 암호화
데이터의 기밀성을 고려하지 않음 데이터의 기밀성을 고려함
누구나 디코딩하여 원문을 구할 수 있음 누구나 복호화하여 원문을 구할 수 없음

- 인코딩은 암호화보다 파일의 크기를 줄이거나, 컴퓨터가 알아들을 수 있는 형식으로 변환하기 위해 사용함

 

  • Base64: 8비트 이진 데이터(실행 파일, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념
    : 알파벳 대소문자, 숫자, +, /로 총 64개로 이루어지며, =은 끝을 알리는 코드로 사용

How to Encoding?

: 24bit 버퍼에 3byte씩 집어넣고, 6bit씩 끊어서 그에 맞는 문자로 변환

 

 

 

대칭키 암호

= 비밀키 암호

: 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘 (ex. DES, AES)

 

 

고대 치환 암호

: 평문을 이루는 각각의 문자를 다른 문자로 바꿔 정보를 숨기는 것

 

카이사르 암호(=시저 암호, Caesar cipher)

: 암호화하고자 하는 내용을 알파벳별로 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 암호 방식 

 

 

비게네르 암호

: 16세기 프랑스의 외교관 비게네르가 고안하였으며, 여러 개의 수를 암호키를 사용해 카이사르 암호보다 한 층 더 복잡한 다중 치환 암호

 

블록 암호

: 평문을 정해진 블록 단위로 암호화하는 알고리즘 (ex. AES, DES)

 

스트림 암호

: 이진 수열로 변환된 평문을 비트 단위로 암호화하는 알고리즘

평문은 암호문과 배타적 논리합(XOR) 연산을 수행해 암호문 생성

 

 

비대칭키 암호

공개키 암호(=비대칭키 암호)

: 암호화와 복호화에 다른 암호 키를 쓰는 알고리즘으로, 전자서명에 사용됨 (ex. RSA, 타원곡선암호)

 

일방향 함수

: 계산은 쉽지만 역을 구하는 것은 어려운 함수로, 대부분의 비대칭키 암호화 방식은 이것으로부터 고안

 

RSA 알고리즘

: 두 개의 큰 소수를 곱한 합성수는 소인수분해가 어렵다는 것을 기반으로 만들어진 암호 알고리즘

 

공개키 암호와 비밀키 암호의 비교

 

 

해시

해시 함수: 데이터를 고정된길이의 데이터를 매핑하는 함수로, N:1 일방향 함수 (ex. CRC, MD5, SHA1 등)

 

키(Key): 매핑 전 데이터의 값(평문)

해시 값(Hash Value): 매핑 후 데이터의 값(암호문)

해시 테이블(Hash Table): 키와 데이터를 저장하는 자료구조

해싱(Hashing): 매핑하는 과정 

 

해시 함수의 특성

  • 해시 값을 알고 있어도 평문을 알아낼 수 없음
  • 어떤 길이의 데이터를 입력해도 항상 고정된 길이의 데이터를 출력함
  • 입력 값의 일부만 변경되어도 해시 값이 매우 크게 변함(눈사태 효과)
  • 같은 입력인 경우 같은 해시 값을 출력함
  • 그리 복잡하지 않은 알고리즘을 사용해 CPU 자원을 적게 소모

해시 충돌: 서로 다른 두 개의 입력값에 대해 동일한 해시 값을 출력하는 상황

 

눈사태 효과

5(‘I.Sly()’)=FBDE1FF2926EA21E74B4E9DCE88629CE

md5(‘I.sly()’)=718D7DA83F2D85F5BE66D51CC80D1F06

 

 

해시 함수 사용 예

- 데이터 무결성 검증: 동일한 데이터에 대해 동일한해시 값을 출력하기 때문

- 비밀번호 저장: 관리자는 해시 값만 보관하여 원래의 비밀번호를 알 수 없음

 

좋은 해시 함수 조건

- 해시 충돌이 없는 함수: 이론적으로 불가능하지만, 확률적으로 0에 가까울수록 좋은 해시 함수

- 역함수 계산이 불가능한 함수: CRC의 경우, 현재 역함수 계산이 가능해짐

- 계산 과정이 복잡하지 않은 함수 등

 

 

스테가노그래피

: 데이터 은폐 기술 중 하나로, 데이터를 다른 데이터에 삽입해 그 데이터의 존재 자체를 숨기는 것

오늘날 디지털 스테가노그래피는 이미지, 오디오 파일, 동영상 클립, 텍스트 파일 등

무해해 보이는 객체 안에 비밀 메시지를 감춰두는 방식으로 활용됨

 

 

2. 네트워크 해킹

네트워크 해킹이란, 네트워크 상에서 발생되는 해킹을 의미

보안의 기본 요소에 따라 기밀성, 무결성, 가용성의 침해를 받음

- 내부의 자산을 파악하기 위해 훔쳐보는 네트워크 스캐닝 같은 행위 (기밀성)

- 정상적인 통신을 강제로 끊고 공격자가 세션을 갈취하는 세션 하이재킹 등의 행위 (기밀성, 무결성)

- 외부에서 네트워크 통신을 이용해 서비스가 정상 작동을 하지 못하도록 하는 Dos 등의 행위 (가용성)

 

  • 기밀성
    • 스니핑(Siffing): 네트워크 흐름의 중간에서 도청, 감시 등의 공격을 하는 행위
  • 무결성
    • 스푸핑(Spoofing): 사용자가 원하는 행위를 속여 비정상적인 행동을 하는 행위
  • 가용성
    • Dos 공격: Denial of Service. 서비스 거부 공격을 수행하여 서버나 시스템이 동작하지 못하도록 공격하는 행위

 

네트워크 용어 정리

  • 시스템
    • 노드: 인터넷에 연결된 시스템의 가장 기본적인 용어
    • 호스트: 컴퓨팅 기능이 있는 시스템. 양 끝단에 있는 송수신기를 뜻 (ex. PC)
    • 클라이언트: 서비스를 요청하는 시스템 (호스트가 송신을 할 때)
    • 서버: 서비스를 제공하는 시스템 (호스트가 수신을 할 때)
  • 프로토콜: 컴퓨터 간에 정보를 주고받을 때의 통신 방법에 대한 규칙이나 표준
  • 게이트웨이: 한 네트워크에서 다른 네트워크로 이동하기 위하여 거쳐야 하는 지점
    • 1계층 리피터(repeater)
    • 2계층 브리지(bridge)
    • 3계층 라우터(router)

프로토콜

기본요소

- 구문(Syntax): 전송하고자 하는 데이터의 형식(Format), 부호화(Coding), 신호 레벨(Signal Level) 등을 규정

- 의미(Semantics): 두 기기 간의 효율적이고 정확한 정보 전송을 위한 협조 사항과 오류 관리를 위한 제어 정보를 규정

- 시간(Timing): 두 기기 간의 통신 속도, 메세지의 순서 제어 등을 규정

 

종류

계층 프로토콜
응용(Application) HTTP, SMTP, FTP, Telnet
표현(Presentation) ASCII, MPEG, JPEG, MIDI
세션(Session) NetBIOS, SAP, SDP, NWLink
전송(Transport) TCP, UDP, SPX
네트워크(Network) IP, IPX
데이터 링크(Data Link) Ethernet, Token Ring, FDDI, Apple Talk
물리(Physical) 없음

 

 

OSI 7계층 (OSI 7 Layer)

국제 표준화 기구 ISO에서 1984년에 네트워크 통신의 구조를 7계층으로 구분하여 각 계층 간 상호 작동하는 방식을 정의해놓은 것

송신자 측: 원본 데이터를 상위 계층 → 하위 계층으로 전달하며 각 계층마다 헤더 추가

수신자 측: 전달 받은 데이터를 하위 계층 → 상위 계층으로 전달하며 원본 데이터 전달 받음

 

  • 1계층 - 물리 계층
    • 최하위 계층이다. 2진법의 바이너리 정보를 전기적, 물리적 신호로 수신자에게 정보 전달 (전송 단위:Bit)
  • 2계층 - 데이터 링크 계층
    • 물리 계층에서 일어날 수 있는 오류들을 찾아내고 수정하여 하위 계층으로 데이터 전달 (전송 단위: Frame)
  • 3계층 - 네트워크 계층
    • 양 끝단의 사용자들의 IP를 확인하여 최적의 정보 전달이 가능한 루트를 찾는 라우팅을 진행 (전송 단위: Packet)
  • 4계층 - 전송 계층
    • 양 끝단의 사용자들이 신뢰성 있는 데이터를 주고받기 위해 프로토콜 정의, 하위 계층으로 데이터 전달 (전송 단위 : Segment)
  • 5계층 - 세션 계층
    • 양 끝단의 사용자들의 통신을 관리하기 위한 방법을 정의하고 하위 계층으로 데이터 전달
  • 6계층 - 표현 계층
    • 원본 데이터를 부호화, 변환, 암호화, 복호화, 압축 등을 진행하여 하위 계층으로 데이터 전달
  • 7계층 - 응용 계층
    • 응용 소프트웨어에서 데이터를 생성하고 하위 계층으로 데이터 전달

 

 

패킷

: 네트워크에서 출발지와 목적지 간의 라우팅 되는 데이터 단위

네트워크 패킷은 사용자 데이터와 제어 정보로 이루어지며, 사용자 데이터는 페어로드라고 함

*제어 정보: 페이로드를 전달하기 위한 정보

 

구성 요소

  • 헤더
    • 소스 주소, 대상 주소, 프로토콜 및 패킷 번호 포함
    • 전송 중인 패킷 유형을 식별하는데 도움이 된다.
  • 페이로드
    • 패킷에 의해 전송되는 실제 데이터를 나타내는 것, 데이터라고도 함
    • 페이로드는 헤더 정보가 목적지에 도달할 때 패킷에서 제거
  • 트레일러
    • 패킷 트레일러의 내용은 각 네트워크 유형에 따라 다름
    • 비트와 CRC 포함

 

 

Wireshark : 네트워크 패킷을 캡쳐하고 분석하는 오픈 소스 패킷 분석 프로그램

- 강력하고 쉬운 사용법 때문에 해킹뿐만 아니라 보안 취약점 분석, 보안 컨설팅, 개인정보 영향평가 등 여러 분야에서 폭넓게 사용된다.

 

 

Wireshark 사용법

  • File
    • Open: 저장된 패킷 파일(dump)을 연다.
    • Save : 수집한 패킷을 파일로 저장
    • Merge : 수집한 여러 개의 패킷 파일을 선택해서 하나로 합친다.
    • Export : 특정 패킷만 내보낸다.
  • Edit
    • Find Packet : 특정 패킷을 찾기
    • Mark/Unmark Packet : 특정한 패킷을 찾기. mark 기능으로 표시 가능
    • Ignore : 불필요한 패킷 무시
    • Preferences : 패킷 프레임의 레이아웃 및 폰트, 색상 설정
  • View
    • 화면 구성 관리 및 보여지는 패킷 관리
    • Colorize : 패킷을 구분해 놓은 색상 관리(분석의 편의를 위해)
    • Coloring Rules : 색상 관리
  • Go : 특정 패킷을 찾거나, 이동할 때 사용
  • Capture : 패킷 수집을 일시정지, 시작, 재시작 등을 관리하는 메뉴
  • Analyze : 선택한 패킷에 대해 관련된 패킷들만 볼 수 있다.
  • Statistics : 전체 패킷에 대한 분석을 요약해놓고 관리
  • Telephony : Voip 패킷 분석
  • Wireless : 무선 통신을 볼 수 있는 기능
  • Tools : 와이어샤크에 쓰이는 도구

 

패킷 캡쳐 시작 / 패킷 캡쳐 멈춤 / 현재 캡쳐 다시 시작 / 캡쳐 옵션 / 파일 열기 / 현재 캡쳐하고 있는 화면 닫기 /

pcap 파일 새로고침 / 특정 패킷 찾기 / 이전에 선택된 패킷으로 돌아가기 /

돌아오기 전에 선택되었던 앞의 패킷으로 돌아가기 / 지정된 패킷으로 이동 /

모든 패킷의 가장 상단 패킷으로 이동 / 모든 패킷의 가장 하단 패킷으로 이동 /

패킷 캡쳐하는 동안 자동으로 스크롤 내리기

 

 

유용한 필터링 

  • eth.addr == 00:3f:1e:00:00:23 //출발지나 목적지 MAC 주소로 검색
  • ip.addr == 192.168.0.2 //출발지나 목적지 IP 주소로 검색
  • tcp.port == 3306 //TCP 출발지나 목적지 포트 번호로 검색
  • ip.src != 10.1.2.3 //출발지 IP 주소가 해당 IP 주소가 아닌 것 검색
  • eth.dst == 00:3f:1e:00:00:23 //목적지 MAC 주소 검색

 

  • No. : 패킷을 수집한 순서
  • Time : 패킷이 수집된 시간
  • Source : 패킷을 보낸 주소
  • Destination : 패킷 도착 주소
  • Protocol : 프로토콜 정보
  • Length : 패킷의 길이
  • Info : 패킷 정보

Packet List : 캡쳐된 모든 패킷을 보여줌

- Source/destination MAC/IP 주소, TCP/UDP, 포트번호, 프로토콜, 패킷 등의 정보를 얻을 수 있음

 

Packet Details

Frame : 1계층 정보

Ethernet : 2계층 정보 (MAC 주소)

Internet Protocol : 3계층 정보 (IP 주소)

Transmission ~ : 4계층 정보

 

Packet Bytes

패킷의 내용을 16진수로 표현한 것

 

 


1. 메모리 구조

프로그램이 실행되기 위해

1) 프로그램이 데이터에 로드되어야 함

2) 프로그램에서 사용되는 변수들을 저장할 메모리도 필요

- 운영체제는 프로그램 실행을 위해 다양한 메모리 공간을 제공함

- 메모리 공간은 크게 코드/데이터/스택/힙 영역으로 나눠짐

 

  1. 코드 영역
    • 코드(code) 영역 : 실행할 프로그램 코드가 저장되는 영역
    • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리
    • 컴파일 된 기계어가 들어가며, 어셈블리 한 줄 단위로 처리됨
    • 명령어 한 줄이 처리되면 EIP 레지스터에 다음 명령어의 주소 저장
    • 프로그램이 종료될 때까지 반복
    • 데이터(data) 영역: 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
    • 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸
    • 전역 변수: 함수의 영향을 받지 않고 프로그램 전체에 적용되는 변수.
      기준으로 main의 바깥인 #include 영역에 선언되는 변수.
    • 정적 변수 : 절대 변하지 않는 변수. 앞에 static을 붙여 선언한 변수는 모두 정적변수.데이터 영역
  2. 힙 영역
    • 힙(heap) 영역 : 사용자가 직접 관리하는 메모리 영역
    • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
    • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
    • 동적 메모리 할당 : 프로그램을 실행하는 동안 사용할 메모리 공간을 할당할 수 있는 것.
      ex) C에서 malloc, C++에서 new 등과 같은 명령어
  3. 스택 영역
    • 스택(stack) 영역 : 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역
    • 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
    • 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 함
    • 푸시(push) 동작으로 데이터를 저장하고, 팝 (pop) 동작으로 데이터를 인출
    • 후입선출(LIFO, Last-In-First-Out) 방식으로 동작 
    • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당

 

 

2. 스택 프레임

스택 영역의 스택 프레임

  • 스택 프레임: 스택 영역에 차례대로 저장되는 함수 호출 정보
  • 함수가 호출되고 생성되는 함수의 매개 변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장
  • 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있음

 

스택 프레임 동작 방식

 

1) 프로그램이 실행되면 가장 먼저 main 함수가 호출되어 main 함수의 스택 프레임이 스택에 저장됨.

2) foo1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장됨.

3) foo2()도 위와 같이 작동.

4) foo2()가 종료되면 foo2() 함수의 스택 프레임이 스택에서 제거됨

5) foo1()과 main()도 위와 같이 작동하며 프로그램이 종료됨.

* 스택의 작동 방식(LIFO)과 동일하게 작동한다.

 

 

스택 오버플로우

: 스택 범위가 꽉 차 흘러 넘쳐러 오류를 일으키는 것

- 함수의 재귀 호출이 무한히 반복되면 해당 프로그램은 스택 오버플로우에 의해 종료됨

- 스택 영역을 넘어가도 데이터가 저장될 수 있으면 해당 프로그램은 오동작을 하게 되거나 보안상 취약점을 가지게 됨

ex) C에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면 에러를 발생시키고 곧바로 프로그램을 강제 종료시킴

 

 

 

함수 호출 과정

1. 함수가 사용할 파라미터(변수)를 스택에 넣고 함수 시작 지점으로 점프한다. → 함수호출

2. 함수 내에서 사용할 스택 프레임을 설정한다. → 프롤로그

3. 함수의 내용을 수행한다.

4. 수행을 마치고 처음 호출한 지점으로 돌아가기 위해 스택을 복원한다. → 에필로그

 

함수 프롤로그

: ebp(베이스 포인터)를 스택에 저장하고, 현재 esp(스택 포인터)를 ebp에 저장하는 것

RBP(Base pointer): 스택 프레임의 Base 주소를 가리키고 있는 포인터 레지스터

RSP(Stack pointer): 스택의 가장 상단을 가리키고 있는 포인터 레지스터

 

함수 에필로그

: mov rsp, rbp 등을 통해 sfp(스택 프레임 포인터)가 저장되어 있는 곳으로 스택 포인터를 맞추고,

그걸 pop rbp(또는 sfp)를 통해 rbp에서 빼내어 이전 함수의 rbp를 다시 복원시키는 것

 

 

 

버퍼 오버플로우 (Buffer Overflow)

: 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것 (버퍼가 흘러넘치는 것)

1. main 함수엔 절대 변경되면 안 되는 중요한 내용이 포함되어 있다.

2. foo1 함수가 실행된다.

3. 사용자의 입력을 받는다.

4. 만약 사용자 입력이 아주 중요한 내용을 덮어쓴다면? 악의적인 내용으로 덮어쓸 수 있다면?

 

 

3. Packing

프로그램 코드 크기를 줄이기 위해 압축(Compressing)하거나, 프로그램 분석을 어렵게 하기 위해 암호화하는 것

 

컴프레싱(Compressing): 단순 압축하는 것

- 초기엔 메모리와 하드디스크 용량이 작아 프로그램의 크기를 줄이기 위해 Compressing 기술을 사용

- 실행 코드를 압축해서 PE 파일의 특정 섹션에 저장 후, 프로그램이 실행될 때 공간에 압축을 풀어 실행하는 구조

- 요즘엔 파일 배포 시 전송 시간과 데이터 요금을 줄이기 위해 압축 사용

 

프로텍팅(Protecting) : 실행 파일을 암호화해서 분석을 어렵게 하는 기술

- 실행 코드를 암호화된 상태로 배포하고, 실행 시점에서 복호화하여 동작을 수행

- 속도 저하의 단점이 있음

 

↔ Unpacking : 패킹된 소스코드를 보기 위해 암호화나 압축을 푸는 행위

 

 

 

4. UPX (Ultimate Packer for eXecutables)

오픈소스 패킹 도구

 

UPX로 패킹된 파일 구성

1) Unpacking Code(언패킹에 필요한 코드 영역)

2) Packed Data(패킹된 데이터가 들어가 있는 영역)

3) Empty Space(패킹된 데이터가 저장될 빈 공간)

 

UPX로 패킹된 실행파일 언패킹

→ 운영체제의 Loader가 실행파일을 메모리에 로딩

→  EntryPoint(진입점)으로부터 프로그램 실행 (패킹된 파일의 진입점은 언패킹 코드 영역에 들어있음)

→  Unpacking Code는 패킹된 데이터를 하나씩 읽어 압축을 풀고, 공간에 원본 데이터를 저장

→  모든 코드가 언패킹되면 Original Entry Point(OEP)에서부터 프로그램이 다시 시작

 

 

EntryPoint

- 프로그램에 대한 제어권이 운영체제에서 사용자 코드로 넘어가는 지점

- EntryPointer 위치는 PE 헤더의 AddressOfEntryPoint에 저장

 

 

5. OEP (Original Entry Point)

패킹된 파일의 실제 프로그램 시작 부분 (언패킹되기 이전 실행 파일 진입점)

- OEP 이전의 실행 부분은 패킹된 파일이 메모리에 로드되어 압축을 푸는 명령어가 들어있음

 

UPX 패킹 특징

: [ PUSHAD ~ POPAD ] 명령어 내부에서 압축해제 코드가 실행,

[ POPAD ] 명령어 실행 후 [ JMP ] 명령어를 통해 OEP로 이동

 

PUSHAD

- 패킹된 파일의 EntryPoint는 PUSHAD 명령어로 시작

- 모든 레지스터 값을 스택으로 백업하는 동작 수행

 

Unpacking Code

- PUSHAD 다음으로 Unpacking Code가 옴

- 압축된 데이터를 풀어 메모리 특정 영역에 저장

 

POPAD

- 언패킹 끝나면 POPAD 명령어로 스택에 저장된 레지스터 값을 복구

- 이후 OEP로 점프해서 프로그램 본래 기능을 수행

- OEP 아래에서 패킹 전 원본 코드를 확인할 수 있음

 

 

 

6. Stolen Byte

'훔쳐진 바이트'라는 의미로 프로그램의 한 부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드

 

- 주로 옮겨지는 코드는 EP 위 몇개의 코드들이며

옮겨진 코드들은 OEP 주소로 점프하기 전 위치에서 PUSH 됨

→ 이 부분의 명령어들은 이동된 곳 또는 할당받은 메모리 공간에서 실행

* 만약, 보호된 프로세스의 메모리가 덤프 되었을 때 Stolen Bytes를 복구하지 못한다면

덤프된 실행파일은 정상적으로 작동 X

 

- POPAD와 jmp OEP 사이에 연속되어진 PUSH 부분으로 패킹된 프로그램을

메모리 덤프를 못하게 하기 위해 만듦

* 보통 stolen byte는 POPAD 구문부터 original entry point로 점프하는 구문 사이에 push 값

 

PUSHAD: 모든 레지스터를 스택에 적재하는 명령어

POPAD: 스택에 백업되어있던 모든 레지스터의 값들을 원래대로 레지스터에 복구시키는 명령어

 

'동아리' 카테고리의 다른 글

8) 포너블  (1) 2026.05.21
6) 리버싱  (1) 2026.05.08
중간세미나 요약  (0) 2026.05.01
4) SQL Injection, 파일 업로드 취약점, XSS, CSRF  (0) 2026.04.10
3) 리눅스 개념 정리 및 OverTheWire 풀이  (1) 2026.04.03