반응형

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

+ Recent posts

반응형
반응형