반응형


Path Truncation 문제를 풀어보겠습니다. 관리자 페이지에 접근하라는 문제인 것 같습니다.



우선, 문제에 들어가면 [Home] 버튼과 [Administration] 버튼이 보입니다.


관리자 페이지에 접근을 해야 되므로 [Administration] 버튼을 눌러보겠습니다.



[Administration] 버튼을 누르면 admin.html URL로 이동되는 것을 알 수 있습니다.


하지만, 403 Forbidden 에러가 뜨는군요. 권한체크를 하는 것 같습니다.



다시 메인 페이지로 돌아가서 이번에는 [Home] 버튼을 눌러보았습니다.


URL 파라미터가 index.php?page=home 형식으로 전송되는 것을 알 수 있습니다. LFI 공격이 가능할 것 같아 보입니다.


그래서, Path Truncation에 대해 찾아보았습니다.


Path Truncation은 LFI 공격 기법 중의 하나로 php limits을 우회하는 방법입니다.

PHP 5.3 하위의 버전에서 나타나느 취약점으로, 파일을 열기 전 파라미터 값의 4096 byte 이상의 길이는 잘려 그 이후의 값들은 버려지게 됩니다.

따라서, 후행 슬래시로 4096 byte 이상의 길이를 삽입하면 하드코딩된 파일 확장명을 우회할 수 있습니다.

GET vulnerable.php?filename=../../../etc/passwd/././././././././/././././././././././[ and so on ] HTTP/1.1


출처 : https://medium.com/bugbountywriteup/cvv-1-local-file-inclusion-ebc48e0e479a



그래서, page=home/../admin.html/./././././././././.././././.././././.././././.././././.././././.././././.././././.././././.(4096 byte 이상...)를 삽입 시도하였습니다.



하지만 별다른 반응이 없어 보였습니다. 이유를 찾다가 아래 문장을 발견하였습니다.


if the truncation can't work just add "x/../" after the file name so it will be like this : "x/../index.php"


출처 : https://hackingparadisesn.blogspot.com/2015/05/introduction-to-local-file-inclusion.html



그래서 home 대신 x(타 임의의 문자 가능)를 삽입 후 ../admin.html에 접근 시도하였더니!!



FLAG 값을 획득할 수 있었습니다.

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] Javascript - Authentication  (0) 2019.04.15
[root-me] HTML - disabled buttons  (0) 2019.04.15
[root-me] SQL Injection - GBK  (0) 2019.02.21
[root-me] Server-side Template Injection  (0) 2019.02.08
[root-me] SQL injection - string  (0) 2019.02.07
반응형


SQL Injection 문제를 풀어보도록 하겠습니다. 관리자 권한을 획득하면 되는 문제인데요, GBK를 이용하라고 하네요.


그래서 일단 GBK를 찾아보았습니다.


GBK는 중국어 간체를 위한 문자 세트로, 2006년 mysql-real-escape-string을 우회하는 방법으로 소개되었습니다.

\xBF' (=URL 인코딩 시 %bf%27) 문자열을 사용하여 싱글쿼터를 우회하는 방식으로 사용됩니다.


출처 : https://pentesterlab.com/exercises/web_for_pentester_II/course



문제로 들어가보면 로그인 창과 위에 멤버 리스트를 보여주는 버튼이 하나 있어서 눌러보았습니다.



멤버 리스트를 보니 "admin"이라는 유저가 존재한다는 것을 명확히 알 수 있었습니다.



SQL Injection 공격을 시도해보았습니다.


많은 시행착오를 겪었는데요, 공격 쿼리나 공격 방법은 상단에 써진 출처를 참고하였습니다.


Query : %bf%27 or 1=1--

          %bf' or 1=1--

          %bf%27 or %bf%271%bf%27=%bf%271

          %bf%27 and 1=1-- 


등... 많은 쿼리로 테스트를 해보았는데, FLAG가 나오지 않았어요.. 구글링해도 문제가 잘못되었다는 둥 Burp로 안된다는 둥...



하지만! 문제를 해결했습니당!!!


login=admin%bf%27 or 1=1-- &password=1 << 주석과 &사이에 공백을 주고, Follow Redirection 버튼을 클릭해야 합니다.


왜 공백을 주어야 하는지는 잘 모르겠습니다만,,, 그래야 follow redirection 버튼이 나오더라고요ㅠ(알려주시면 감사하겠습니다^^)



follow redirection 버튼을 클릭하면 FLAG 값이 노출되는 곳으로 리다이렉트되어 플래그를 획득할 수 있습니다.

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] HTML - disabled buttons  (0) 2019.04.15
[root-me] Path Truncation  (0) 2019.02.26
[root-me] Server-side Template Injection  (0) 2019.02.08
[root-me] SQL injection - string  (0) 2019.02.07
[root-me] LFI - Double Encoding  (1) 2019.01.17
반응형

#1. Programmed I/O

- 원하는 I/O가 완료되었는지 여부를 검사하기 위해 CPU가 상태 플래그를 계속 조사하여 I/O가 완료된 경우 MDR(MBR)과 AC 사이의 자료 전송을 CPU가 직접 처리하는 방식

- I/O 작업 시 CPU는 계속 I/O 작업에 관여해야 하기 때문에 다른 작업을 할 수 없음

- 입력의 완료를 알리기 위해 인터럽트가 필요 없는 대신 CPU가 지속적으로 입출력 완료 여부를 확인해야함



#2. Interrupt I/O

- 데이터를 전송할 준비가 되면 I/O 인터페이스가 컴퓨터에게 알려 입출력이 이루어짐

- I/O 인터페이스는 CPU에게 인터럽트 신호를 보내 입출력이 있음을 알림

- CPU가 지속적으로 Flag를 검사하지 않아도 되기 때문에 Pragrammed I/O보다 효율적

- CPU가 입력을 지시한 후 워드의 입력이 이루어지는 사이 다른 작업(타 프로그램 실행)이 이루어짐



#3. DMA(Directed Memory Access)

- 입출력 기기들이 CPU의 레지스터를 거치지 않고 직접 메모리를 엑세스하여 입출력 데이터 전송

- CPU는 I/O에 필요한 정보를 DMA 제어기에 알려 I/O 동작을 개시시킨 후, 다른 작업을 수행

- 입출력 자료 전송 시 CPU를 거치지 않기 때문에 CPU의 부담 없이 빠른 데이터 전송 가능

- DMA의 우선순위는 메노리 참조의 경우 중앙처리장치보다 상대적으로 높음

- 인터럽트 신호를 발생시켜 CPU에게 입출력 종료를 알림

- Cycle Steal 방식을 이용하여 데이터 전송

  (CPU와 DMA 방식의 입출력 장치가 공통된 버스를 통해 주기억장치에 연결된 경우, 우선순위가 높은 입출력 채널이 접근 사이클을 먼저 사용하여 주기억장치에 접근하는 것 >> 작업 효율성 UP, CPU의 양보)

- CPU가 DMA 제어기로 보내는 정보

a. I/O 장치의 주소

b. 데이터가 있는 주기억장치의 시작주소

c. DMA를 시작시키는 명령

d. 입출력하고자 하는 자료의 양

e. 입력 또는 출력을 결정하는 명령


- DMA 구성요소

a. 인터페이스 회로 : CPU와 입출력장치 통신 담당

b. 주소 레지스터 및 주소라인 : 기억장치의 위치 지정을 위한 번지 기억 및 전송

c. 워드 카운트 레지스터 : 전송되어야 할 워드의 수 기억

d. 제어 레지스터 : 전송방식 결정

e. 데이터 레지스터 : 전송에 사용할 자료나 주소를 임시로 기억하는 버퍼 역할


- DMA 전송 절차

1. CPU가 DMA 제어기에 명령을 내림

2. DMA제어기가 CPU에게 버스 사용 요구 (= Bus Request)

3. CPU가 DMA 제어기에게 버스 사용 허가 (= Bus Grant)

4. DMA 제어기가 주기억장치에서 데이터를 읽어 디스크로 전송 (= Data Transfer)

5. 2~4번을 반복하다가 데이터 전송이 완료되면 인터럽트 신호 보냄



#4. Channel I/O

- I/O를 위한 특별 명령어를 I/O 프로세스에게 수행토록 하여 CPU 관여없이 주기억장치와 입출력장치 사이에서 입출력을 제어하는 입출력 전용 프로세서(IOP)

- 채널을 DMA 방법으로 입출력 수행 (= DMA 확장 개념)

- 채널 제어기는 채널 명령어로 작성된 채널 프로그램을 해독하고 실행하여 입출력 동작 처리

- CPU로부터 입출력 전송을 위한 명령어를 받으면 CPU와는 독립적으로 동작하여 입출력 완료

- 채널을 주기억장치에 기억되어 있는 채널 프로그램의 수행과 자료 전송을 위해 주기억장치 직접 접근

- I/O 장치는 제어장치를 통해 채널과 연결

- I/O 채널을 CPU의 I/O명령을 수행하지 않고 I/O 채널 내의 특수목적 명령을 수행함

- CPU와 인터럽트로 통신

- 채널의 종류

a. Selector Channel : 고속 입출력장치(자기디스크, 자기테이프, 자기드럼) 1개와 입출력하기위해 사용

b. Multiplexer Channel : 저속 입출력장치(카드리더, 프린터) 여러개를 동시에 제어하는 채널

c. Block Multiplexer Channel : 동식에 여러 개의 고속 입출력 장치 제어



#5. Isolated I/O

- 입출력 장치들이 입출력 버스를 통해 CPU와 연결되어 있는 경우

- 메모리는 따로 메모리 버스를 통해 연결

- 입출력은 입출력을 담당하는 명령어를 통해 실행/입출력버스를 통해 해당 장치의 지정, 데이터, 입출력 구분 제어값 전달

- 입출력 명령어가 명령어 집합에 추가되어 제어로직 복잡

- 입출력 버스를 장착하는데 추가비용



#6. Memory-mapped I/O

- CPU가 입출력 장치를 엑세스할 때, 입출력과 메모리의 주소공간을 공동 데이터버스, 주소버스, 제어버스 등으로 구분하지 않고 하나의 메모리 공간에 취급하여 배치하는 방식

- 입출력을 위한 명령어를 따로 사용않고, 메모리에 대한 명령어를 활용하여 입출력 수행

- 입출력 장치들은 각각 메모리의 한 번지를 할당받아 입출력 수행 > 메모리를 동적으로 사용 불가


반응형
반응형

1. 소프트웨어적인 방법 = 폴링(Polling)


  • 인터럽트 발생 시 높은 우선순위의 인터럽트 자원부터 인터럽트 요청 플래그를 검사하여, 우선순위가 가장 높은 인터럽트 자원을 찾아내 루틴을 수행하는 방식
  • 많은 인터럽트가 있을 경우, 모두 조사하는 데에 시간이 걸려 처리 속도가 느림
  • 회로가 간단함
  • 융통성이 있음
  • 별도의 하드웨어가 필요없어 경제적


2. 하드웨어적인 방법 = Vectored Interrupt


  • CPU와 인터럽트를 요청할 수 있는 장치 사이에 장치번호에 해당하는 버스를 직렬이나 병력로 연결하여 요청 장치의 번호를 CPU에게 알리는 방식
  • 인터럽트 벡터란, 인터럽트를 발생한 장치가 프로세서에게 분기할 곳에 대한 정보를 제공하는 것
  • 장치 판별을 위한 별도의 프로그램 루틴이 없어 응답 속도가 빠름
  • 회로가 복잡함
  • 융통성이 없음
  • 추가적인 하드웨어가 필요하므로 비경제적
1) 직렬(Serial) 우선순위 부여 방식 = 데이지체인(Daisy-chain)
- 인터럽트가 발행하는 모든 장치를 한 개의 회선에 직렬로 연결
- 우선순위가 높은 장치를 선두에 위치시키고 나머지를 우선순위에 따라 차례로 연결
- 호스트에 가까운 쪽에 높은 우선권을 두는 경우가 많음 

2) 병렬(Parallel) 우선순위 부여 방식
- 인터럽트가 발생하는 각 장치를 개별적인 회선으로 연결
- Mask Register의 비트 위치에 따라 우선순위 결정
- Mask Register는 우선순위가 높은 것이 서비스를 받고 있을 때, 우선순위 낮은 것을 비활성화 할 수 있음
- 우선순위가 높은 인터럽트는 낮은 인터럽트가 처리되는 중에도 우선적으로 처리됨

3. 요약정리

 

H/W

S/W

속도

빠름

느림

회로

복잡

간단

융통성

없음

있음

경제적

비경제적

경제적





반응형
반응형

Server-side Template Injection 문제입니다. 처음에 접했을 때는 생소한 공격방법이라 당황했었는데요,

구글 검색 시 많은 정보가 나오더라고요.. (공부 안한거 들통ㅠ)


이 문제를 풀 때 개념을 https://www.netsparker.com/blog/web-security/server-side-template-injection/ 이 곳에서 파악했구요,

상세 공격 방법들은 https://portswigger.net/blog/server-side-template-injection 이 곳을 참고했습니다.

요약하면, Server Side Template는 동적 HTML을 생성할 수 있다는 큰 장점때문에 사용되고 있는데, 템플릿 문자열 내에 사용자가 입력을 제어하는 부분을 이용하여 사용자가 템플릿 표현식을 실행할 수 있을 경우 원격 코드 실행까지 이어질 수 있다는 것입니다.

 

문제를 풀어보도록 하겠습니다.


문제에 들어가보면, 닉네임을 입력하라는 입력창과 check 버튼이 있습니다.

임의의 문자열을 삽입한 후 버튼을 클릭하면 아랫 줄에 echo 명령어처럼 사용자가 입력한 값을 그대로 뿌려줍니다.


이번에는 공격 가능성이 존재하는지 알아보도록 하겠습니다.


${7*7} 을 입력할 경우, 공격이 불가능한 경우라면 "${7*7}" 전문이 나오는 것이 정상이지만, 문제에서는 계산이 되어 나옵니다.

때문에, 원하는 명령어를 실행할 경우 서버에서 실행되어 결과 값을 얻을 수 있을 것 같습니다..


우선, 간단한 명령어부터 실행해보도록 하겠습니다.


<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("실행할 명령어") } << 명령 코드를 입력하면 위와 같이 명령어 결과 값을 확인할 수 있습니다. (공격코드는 상위 링크에서 확인하였습니다.)


whoami 명령어 역시 정상 동작하여 결과를 확인 할 수 있었습니다.


이번에는 문제에서 요구한 파일을 읽어보겠습니다. 간단한 cat 명령어로 flag를 획득할 수 있습니다.

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] Path Truncation  (0) 2019.02.26
[root-me] SQL Injection - GBK  (0) 2019.02.21
[root-me] SQL injection - string  (0) 2019.02.07
[root-me] LFI - Double Encoding  (1) 2019.01.17
[root-me] PHP filters  (0) 2019.01.16
반응형

SQL injection string형 문제를 풀어보았습니다. 역시 관리자의 패스워드를 알아내야 합니다.


문제에 들어가시면 홈/검색/로그인 탭이 있습니다.

이 메뉴들 중에서 SQL Injection이 가능한 포인트를 찾는 것이 관건이었습니다.

news_id 파라미터, 로그인 메뉴의 login, password 파라미터 등 여러 곳에서 SQL Injection을 시도해보았으나,

유일하게 SQL Injection이 가능한 포인트는 검색 메뉴의 recherche 파라미터 였습니다.


검색어에 a를 삽입하면 정상 값으로 5개의 결과 값을 출력하였고요,

a'를 삽입하니 syntax Error가 출력되어서 a%'를 삽입 해보았습니다.


no such column 이라는 에러가 떠서 저는 이곳이 SQL Injection에 취약한 포인트라 판단하였습니다.


이번에는 필드 갯수를 구하기 위해 order by 구문을 삽입했는데요, 아래 구문을 순차적으로 삽입하여 필드 갯수 가 2개인 것을 파악하였습니다.

a%' order by 1--

a%' order by 2--

a%' order by 3-- << 에러 출력 


sql 쿼리문을 삽입하여 스키마 정보를 파악해보았습니다.

a%' union select 1, sql from sqlite_master-- 구문을 삽입하여 news 테이블과, users 테이블이 존재하고 있음을 알 수 있습니다.


마지막으로, 관리자 패스워드가 존재할 것 같은 users 테이블에서 username과 password 값을 출력하면 됩니다.

a%' union select username, password from users-- 해당 구문을 삽입하면, 관리자의 패스워드를 획득할 수 있습니다.

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] SQL Injection - GBK  (0) 2019.02.21
[root-me] Server-side Template Injection  (0) 2019.02.08
[root-me] LFI - Double Encoding  (1) 2019.01.17
[root-me] PHP filters  (0) 2019.01.16
root-me >> SQL injection - blind  (0) 2018.06.08
반응형

1. 인터럽트(Interrupt) 란?


CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 처리할 수 있도록 하는 것.


CPU의 모든 상태는 PSW에서 유지되는데 인터럽트를 알리는 5bit가 있고, 5가지 인터럽트 서비스 루틴(ISP)가 운영체제 일부에 존재한다. 인터럽트 처리 중 다른 인터럽트 발생 시, 우선순위에 의해 인터럽트 처리한다.


2. 인터럽트(Interrupt) 처리 순서


  1. 현재 진행 중인 기계어 코드를 완료한다.
  2. CPU의 특수 레지스터 중 하이로 인터럽트 마스크 비트를 보고 마스크되면 인터럽트를 무시한다.
  3. 인터럽트 벡터를 읽는다.
  4. ISR 주소 값을 얻는다.
  5. ISR로 점프한다. 이 때, PC(Program Counter)값을 자동 저장된다.
  6. 현재 진행중인 프로그램의 레지스터를 저장한다.
  7. 해당 코드를 실행한다.
  8. 해당 코드를 다 처리하면, 저장한 레지스터를 복원한다.
  9. ISR 끝에 IRET 명령어에 의해 인터럽트가 해제된다.
  10. IRET 명령어가 실행되면, 저장한 PC 값을 복원하여 이전 실행 위치로 이동한다


3. 인터럽트(Interrupt) 종류


1. 하드웨어 인터럽트(Hardware Interrupt)

  • 기계검사 인터럽트 : 프로그램을 실행하는 도중 갑작스런 정전이나 컴퓨터 자체 내에서 기계적 문제가 발생한 경우
  • 외부 인터럽트 : 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
  • 입출력 인터럽트 : 입출력의 종료나 입출력의 오류에 의해 CPU의 기능이 요청되는 경우
  • 프로그램 검사 인터럽트 : 프로그램 실행 중 보호된 기억공간 내에 접근하거나 불법적인 명령 수행과 같은 프로그램 문제가 발생한 경우

2. 소프트웨어 인터럽트(Software Interrupt)
  • 존재하지 않는 메모리 주소에 접근하는 경우
  • 나눗셈 연산의 경우 0으로 나누는 등의 논리적 오류가 발생하는 경우

4. 인터럽트(Interrupt) 우선 순위

전원 공급 이상 → CPU의 기계적 오류 → 외부 신호에 의한 인터럽트 → 입출력 전송 요청 및 전송 완료/전송 오류 → 프로그램 검사 인터럽트 → 슈퍼바이저 호출(SVC 인터럽트)

5. 참조 문서



반응형
반응형

#1. 폰노이만 아키텍처(Von Neumann)

  • 메모리에 명령어와 데이터를 함께 저장하며, 데이터는 메모리에서 읽기/쓰기가 가능하나, 명령어는 메모리에서 읽기만 가능
  • 명령어와 데이터 모두 동일한 메모리 버스를 통해 명령 수행(=메모리 공유)
  • 프로그램 내장방식
  • CPU는 한번에 하나의 명령어만 수행 가능(비효율적)
  • 명령어와 데이터 모두 주기억장치에 저장하기 때문에 병목현상 발생


#2. 하버드 아키텍처(Harvard)
  • 명령어 메모리에서 명령어를 가져와 분석/실행하고 참조/결과에 대한 저장은 데이터 메모리에 별도로 하는 구조 
  • CPU는 명령어와 데이터를 동시에 사용할 수 있음
  • 명령어 영역마다 주소버스, 데이터 버스, 제어 버스가 따로 존재
  • 현재 명령 실행 후 바로 다음 명령을 가져올 수 있어 속도 우수
  • 버스 시스템이 복잡해 설계가 복잡
  • 상대적으로 적은 명령어 수와 주소모드
  • 메모리 참조는 LOAD와 STORE로 제한
  • 고정된 명령어 길이 → 디코딩이 간단
  • 단일 사이클의 명령어 실행
  • 명령어 구조 상 RISC 구조
  • 메모리를 분리하여 파이프라인 사용 시 최적


반응형
반응형

LFI Double encoding 문제를 풀어보도록 하겠습니다.


문제를 들어가보니 Home 탭 옆에 CV 탭과 Contact 탭이 존재합니다. 우선 CV 탭을 클릭해보겠습니다. 


CV 탭을 클릭하니 URL 상 page 파라미터가 나오네요. 여기에 LFI 취약점 테스트를 해보도록 하겠습니다.


상위 폴더로 이동 가능한 특수문자 "../"을 삽입하니 공격 구문이 탐지되었습니다ㅜ


이번에는 "../"을 URL 인코딩하여 삽입해 보았으나 역시 공격이 탐지되었습니다.


URL Double Encoding을 해보았습니다. "../"을 두번의 URL 인코딩 후 삽입하였더니! 필터링 없이 LFI 취약점이 발견되었습니다.


php 코드는 실행이 되어버리기 때문에 php wrapper를 사용합니다. 

[php://filter/convert.base64-encode/resource=cv] 문자열을 URL encoding으로 두번 인코딩한 후 삽입해보겠습니다.


그랬더니, 정상적으로 공격이 수행되어 cv의 소스코드가 base64로 인코딩된 코드가 노출되었습니다.

base64로 디코딩해보겠습니다.


BASE64로 디코딩 한 소스 내에서 conf.inc.php 파일이 존재하는 것을 파악할 수 있었습니다.

conf.inc.php 코드를 봐야겠군요.


php wrapper를 통해 [php://filter/convert.base64-encode/resource=conf] 문자열을 URL 인코딩으로 두번 한 후 삽입하겠습니다.


정상적으로 공격이 성공하여 BASE64로 인코딩된 소스코드가 노출되었습니다.


BASE64 디코더로 디코딩 해보니 FLAG 값이 나와있습니다.!! 


반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] Server-side Template Injection  (0) 2019.02.08
[root-me] SQL injection - string  (0) 2019.02.07
[root-me] PHP filters  (0) 2019.01.16
root-me >> SQL injection - blind  (0) 2018.06.08
root-me>>SQL injection - numeric  (0) 2018.05.01
반응형

#1. CISC(Complex Instruction Set Computer)

  • 복잡한 명령어 집합을 가진 CPU 아키텍쳐
  • 복잡한 하드웨어 회로
  • 많은 수의 명령어와 주소모드가 존재하나 실제로 쓰이는 명령어는 한정
  • 실행 성능 개선(파이프라인 등..) 방법 적용이 어려움
  • 대부분의 명령어는 직접 메모리 접근이 가능
  • 풍부한 어드레싱 기능 → 명령의 직교성이 뛰어남


#2. RISC(Reduced Instruction Set Computer)
  • CPU 명령어 개수를 줄여 간단한 하드웨어 회로
  • SPARC, MIPS 등의 아키텍처에서 사용
  • 복잡한 연산 → 단순한 여러 개의 명령어로 처리 가능
  • 프로세서 레지스터 뱅크 & 캐시 존재 → 시스템 수행속도 향상
  • 메모리와 CPU 사이 데이터 전송 시 LOAD와 STORE 명령만으로 한정
  • 명령어 형식은 모두 같은 길이
  • 어드레싱 모드의 수는 제한

 

 CISC

RISC 

 주요 특징

 복합명령어 / 하드웨어 복잡

 고정 명령어(32bit) / 하드웨어 간단

 CPU 명령

 명령어 갯수 많음 → 실행 사이클(속도) 다양

명령어 길이 고정 → 실행 사이클 동일 

 회로 구성

복잡 

단순 

 메모리 사용

 효율

비효율 

 프로그램 코드사이즈

 small(130~140)

large(160~180) 

 프로그램 측면

명령어 적게 사용 

 상대적 많은 명령어

 컴파일러

 복잡

단순 


※표는 
블로거 bitnang님의 자료를 참고하였습니다. >> https://blog.naver.com/bitnang/220692059829
문제가 된다면 삭제하겠습니다.


반응형

+ Recent posts

반응형
반응형