Be myself :: Be myself

달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

워게임 사이트

Wargame 2014. 5. 5. 14:15

침투테스트 가상환경을 샌드박스 형태로 제공하여, 온라인상에서 모의해킹을 해볼수 있는 사이트

https://hack.me/

   

OWASP에서 웹 취약점 테스트를 위해 제공하는 VM웨어용 가상이미지 파일 다운로드 및 프로젝트 페이지

http://sourceforge.net/projects/owaspbwa/files/

   

각종 리눅스용 VM이미지를 다운받을 수 있는 사이트

http://www.thoughtpolice.co.uk/

   

온라인상으로 프로그래밍언어를 실행하고 컴파일할 수 있는 사이트

http://compileonline.com/

   

취약한 웹 어플리케이션 소스를 제공하는 사이트

http://www.dvwa.co.uk/

   

온라인 모의해킹 사이트

http://hack-me.org/index.php?p=home

   

OWASP 취약점을 바탕으로한 취약점 테스팅 가상환경

http://sourceforge.net/projects/vicnum/

   

리눅스, 아파치, PHP, MySQL의 보안을 학습하기 위한 가상환경을 제공

http://sourceforge.net/projects/lampsecurity/

   

웹취약점 테스트를 하기 위해 제작된 가상이미지

http://sourceforge.net/projects/websecuritydojo/

   

다양한 환경에서 악의적인 코드를 분석할 수 있는 가상머신

http://bruteforce.gr/honeydrive

   

웹취약점 테스트 환경을 제공하는 사이트

https://www.pentesterlab.com/exercises

   

웹해킹 전문가가 만든 침투테스트를 위한 가상 이미지

https://bechtsoudis.com/work-stuff/challenges/drunk-admin-web-hacking-challenge/

   

다양한 모의 해킹를 실습하고 트레이닝할 수 있는 기능을 제공하는 툴

http://sourceforge.net/projects/null-gameover/

   

SQL 인젝션을 테스트하고 실험해 볼 수 있는 환경(소스)를 제공하는 사이트

https://github.com/Audi-1/sqli-labs

   

침투테스트 환경을 제공(DVL)

http://sourceforge.jp/projects/sfnet_virtualhacking/downloads/os/dvl/DVL_1.5_Infectious_Disease.iso/

   

모의해킹 연습 사이트 링크 모음

http://chogar.blog.me/80130034776

   

모의해킹 관련 정보를 제공하는 사이트 (아래 그림 출처)

http://www.amanhardikar.com/mindmaps/PracticewithURLs.html 

 

[출처] 모의해킹을 연습할 수 있는 환경을 제공하는 사이트|작성자 Exception

   

'Wargame' 카테고리의 다른 글

Fc3 dark_eyes  (0) 2014.08.22
Suninatas all clear  (3) 2014.07.25
워게임 현황  (0) 2014.07.01
CodeEngn 베이직 올클  (0) 2014.05.14
BOF원정대 level3  (0) 2014.05.04
Posted by flack3r
|

   

그냥 인터럽트 걸고 eax,ebx,ecx,exd 나 mov and sub 명령어를 막쓰면,, 저렇게 널바이트가 생긴다.

널바이트가 생기면 위에서 사진에서 보이듯이 우리가 원하는 실행결과가 나오지 않는다.

따라서 널바이트를 생기지 않게 하기 위해 명렁을 간결하고 메모리를 최소한 이용해서 짜야한다.

일단 문자열을 레지스터에 등록하기 위해 함수를 호출하면 리턴주소가 쓰인다는 점을 이용해서 함수 호출 후 pop해 ecx에 문자열 주소값을 등록하는 과정을 볼 수 있다. 이때, 함수 호출 부분을 제일 밑으로 내린 이유는, 처음에 부분에 쓰면 양의 값으로 주소값이 증가되기 때문에, 이부분에서 null바이트가 생길 수 있다. 따라서 밑에서 쓰고, 나머지 명령어들은 mov는 자제하고 쓸 경우 al,bl,cl,dl등을 이용하고 숫자 증가 inc나 dec명령어 등을 입력해 셸코드를 최소화 한다.

   

이런식으로 작성을 완료하면 널바이트 없이 셸코드가 완성된다.

------------------------------------------------------------------------------------------

                                                          <본격적으로 만들기>

사실 위와 같이 함수를 이용해 독자적인 셸코드를 생성할 수 있지만, 좀 더 경량화된 셸코드를 생성하기 위해선 스택을 이용할 필요가 있다. 즉, 스택에 아스키코드로 문자열을 하나하나 올려 (mov 대상 esp) 처럼 쓴다면, 함수 호출로 인한 코드의 수가 줄어 들 것이다. 사진을 한번 보자.

위와 같이 완성될 수 있다.

execve 시스템 콜 번호는 11번이다.

   

여기서 더 작게 만드는 방법이 있다.

바로 cdq(Convert Doubleword to Quadword)라는 명령어와, 스택을 이용하는 방법이다.

cdq를 이용하는 방법은 다음과 같다.

사실 cdq는 32비트 정수에서 64비트 정수로 확장하는 개념인데, 동작상 EAX부호 비트가 0이면 EDX레지스터도 0으로 만든다.

스택을 이용하는 방법은 eax에서 시스템 콜번호를 쓸때 mov 대신, push BYTE 0xb 한다음 pop eax하면 코드가 1바이트 더 작아진다.

출처: 해킹과 공격의 예술 공부중 정리

'Exploit' 카테고리의 다른 글

C++에서 VTable  (0) 2014.07.12
여러 보호기법  (0) 2014.07.11
SEH overwriting  (0) 2014.07.10
윈도우 BOF  (2) 2014.05.28
FSB공격 정리  (0) 2014.05.04
Posted by flack3r
|

1 개요

GDT(Global Descriptor Table)란 각종 Descriptor의 테이블을 가지고 있는 것이다. 각종 세그먼트나 여러 가지 테이블들이 어떻게 구성되어 있는지 적어놓은 하나의 메모장이라 생각하여도 좋다. 필요성은 첫째, Real mode 에서 Protected 모드로 전환하기 위해 필요한 것이다. 각 세그먼트들을 나누어야 세그먼트들의 접근 유무를 확인할 수 있기 때문이다. 둘째, GDT는 IDT(Interrupt descriptor table)의 주소 값을 가지고 있어 인터럽트가 발생 하였을 때 어떤 처리를 할 것인지 결정하는 첫 번째 역할을 한다. 이 설명만으론 뭔가 부족하다. 다음 그림은 GDT가 설정되지 않았을 때 보이는 현상이다. 마우스를 표현 하였지만, 마우스가 움직이질 않는다. GDT에 IDT등록을 하지 않아서 이다.

그냥 그림이라 마우스가 움직이는지 그렇지 않은지 직접 확인은 하지 하지만, 움직이지 않는다.(믿어달라. 혹시 직접 확인해 보고 싶은 사람은 'OS구조와 원리'책을 참고하기 바란다.)

그럼, GDT가 왜 필요한지 알았으니, GDT를 만들어 어떻게 Protected모드로 전환되는지 먼저 살펴보고, 다음 글에서 인터럽트와 함께 IDT에 관한 부분을 살피겠다.

먼저 어떠한 순서로 Real Mode에서 Protected mode로 전환되는지 살펴 보겠다.

GDT 만들기 Protected Mode 레지스터 세팅 파이프라인 지우기 prefix를 사용한 점프

* real mode와 protected mode

real mode는 16비트로 동작하고, pc가 부팅할 때 처음 동작하는 cpu모드 이다. 이 영역에선 주소설정을 자유롭게 할 수 있어 악의적인 프로그래머가 커널영역의 메모리를 자유롭게 사용할 수 있어 os를 파괴하거나 등의 보안상의 문제가 발생할 수 있다.

반면 protected mode는 32비트로 동작하고, 각 세그먼트들의 속성값을 설정하여 각 세그먼트들의 접근을 보호한다.

2 protected mode로의 전환

2.1 GDT만들기

일단 GDT테이블에 등록되는 디스크립터의 생김새를 살펴 보자.

Limit 0~15bit

Base Address 0~15bit

P

DPL

S

type

Base Address 16~23bit

Base Address 24~31bit

G

D

0

AVL

Limit 16~19bit

<GDT 디스크립터>

위 그림에 대해 설명하자면, P는 페이징 기능과 관련되어 있고 일반적으로 1을 나타낸다. DPL은 보안과 관련되어 있는데 커널 레벨인지 유저레벨인지 나타낸다. 만약 셀렉터 레지스터의 RPL이 DPL보다 레벨이 높을 경우(예를 들어 유저영역에서 커널 영역으로 접근하려 할 시) 접근하지 못하도록 차단한다. S는 시스템 세그먼트인지 코드 세그먼트인지를 나타내고 type은 읽고 쓸수 있는지, 실행할 수 있는지 등을 나타낸다. G는 세그먼트 크기 단위를 나타내는데 0이면 BYTE고 1이면 4KB이다(즉, 4G사용) D비트는 이 세그먼트가 16비트인지 32비트로 작동하는지를 나타 낸다. Limit는 세그먼트 크기이고 Base Address는 세그먼트의 첫 시작 주소를 나타낸다. Base Address와 Limit가 왜 이렇게 나누어져 있는지는 예전 cpu와의 호환성 때문이다.

2.2 Protected mode 레지스터 세팅

이렇게 여러 개의 디스크립터로 만들어진 GDT를 등록해야 하는데, 이를 GDTR이라는 레지스터에 등록한다. 이 레지스터는 48비트 크기로 첫 16비트는 GDT의 크기가, 나머지 32비트엔 GDT의 시작주소가 물리주소로 들어간다.

이렇게 설정하면, 주소 지정은 어떻게 이루어 지는지 살펴보자. 세그먼트 레지스터는 16비트의 셀렉터 레지스터(CS,DS 등등..) 와 64비트 디스크립터 레지스터로 나뉘는데, 프로그래머가 사용할 수 있는 것은 셀렉터 레지스터일 뿐이다. 디스크립터 레지스터는 GDT디스크립터와 모양이 비슷하고 셀렉터 레지스터의 모양을 살펴 보자.

Index

TI

RPL

인덱스 값은 GDT에서 찾는 디스크립터가 어디에 위치하는지 찾는 값이고 RPL은 이 세그먼트가 커널영역인지 유저영역인지 확인하는 역할을 한다.

그럼 셀렉터 레지스터에 값을 넣었을 때 어떻게 동작하는지 살펴 보겠다.

그렇다면, 결과적으로 지금까지 디스크립터 레지스터에 값을 넣기 위한 일을 한 것이다. 이렇게 구한 디스크립터 레지스터의 Base Address의 값을 통해 Protected 모드에서의 주소 지정방법을 설명할 수 있다. 예를들어 [ds:0x65]라고 한다면, 0x65와 limit를 체크하여 세그먼트 크기를 넘지 않는지 확인하고 넘지 않는다면, Base Address의 값과 0x65의 값을 합하여 물리주소의 값을 구한다.

2.3 파이프라인 지우기

우선 파이프라인을 지우기 전에 CR0의 레지스터의 최하의 비트를 1로 바꾼다. 이 비트는 pe비트라고 하며 1로 바꾸면 32비트 시스템으로 동작한다.

CPU가 연산할 때, I/O bus interface에서 명령어를 가져오고, 해석하고, 실행하고, 데이터 메모리 엑세스등의 단계를 거치는데, 단계들 마다 명령어를 각각 실행시켜 빠르게 하는 것을 파이프 라이닝 이라 한다. 쉽게 말하자면, 각 단계들을 수행하는 장치들이, 하나의 명령어를 처리하고, 그 명령어의 단계가 끝날 때까지 기다리는 것이 아니라, 다음 명령어의 그 단계를 처리한다면 더 빠르게 처리할 수 있다는 것이다. 더 자세한 사항은 기회가 되면 설명하도록 하겠다. 이러한 특성 때문에 Real mode의 16비트에서 Protected mode의 32비트로 전환 시, 현재 Excute되는 명령어만 바꾸어야 할 뿐만 아니라 cpu유닛에 남아있는 다른 단계들의 값들을 지우거나, 32비트로 바꾸어 주는 과정을 거쳐야 한다. 여기서 바꾸어 주는 과정은 따로 명령어가 없기 때문에 불가능하고, 지우는 방법을 택한다.

2.4 Prefix를 사용한 점프

16비트 레지스터에서 32비트 레지스터로 바꾸기 위해 명령어에서 제일 앞에 0x66과 0x67을 붙이면 된다. 혹은 32비트에서 16비트로 변형시킬 때도 쓰인다. 0x66은 operand prefix인데, 명령어의 오퍼렌드의 값을 변형시킨다. 0x67은 address prefix인데 대상 주소값을 변형 시킨다.

'컴퓨터구조&OS > OS' 카테고리의 다른 글

5. 보호  (0) 2014.05.05
4. Task switching  (0) 2014.05.05
3. 인터럽트 처리  (0) 2014.05.05
메모리 구조  (0) 2014.05.04
1.OS의 시작  (0) 2014.05.04
Posted by flack3r
|