ASLR (Address Space Layout Randomization) : 라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤하게 바꿔 RTL과 같이 정해진 주소를 이용한 공격을 막기 위한 보호 기법이다.

 

/proc/sys/kernel/randomize_va_space 의 파일의 값을 바꿔주면 된다.

 

0 : ASLR 적용해제

1 : 스택, 힙 메모리를 랜덤화

2 : 스택, 힙, 라이브러리 메모리를 랜덤화

 

-> 바이너리 코드 영역의 주소는 변하지 않기 때문에 ASLR 보고 기법을 우회하여 익스를 할 수 있다.

 

--- 계속 할수도

'메모용' 카테고리의 다른 글

메모리 보호 기법 [ NX-Bit(MS : DEP) ]  (0) 2020.12.18
Format String Bug - simplefsb (Y.CTF)  (0) 2020.12.12
PLT & GOT 간단하게 정리.  (0) 2020.08.21

1. NX-Bit ( NX bit, Never eXecute bit, 실행 방지 비트 )

 

 - 프로세스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술이다.

 

 - NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세스 명령어가 그 곳에 상주하지 않음 으로써 실행되지 않도록 만들어 준다.

 

> 인텔 : XD-bit (eXecute Disable) = NX-bit

 

 

2. DEP (Data Execution Prevention)

 

 - 마이크로소프트 윈도우 운영체제에 포한된 보안기능이고, 악의적인 코드가 실행되는 것을 방지하기 위해 메모리를 추가로 확인하는 하드웨어 및 소프트웨어 기술이다.

 

 - DEP의 두 가지 모드

 

   > 하드웨어 DEP : 메모리에 명시적으로 실행 코드가 포함되어 있는 경우를 제외하고, 프로세스의 모든 메모리 위치에서 실행할 수 없도록 표시한다.

 

   > 소프트웨어 DEP : CPU가 하드웨어 DEP를 지원하지 않는 경우 사용한다.

 

 

3. NX-Bit 우회 방법

 

 - ROP ( Return-Oriented-Programming )

 

 - RTL ( Return-to-Libc ) 

'메모용' 카테고리의 다른 글

ASLR 정리  (0) 2021.08.24
Format String Bug - simplefsb (Y.CTF)  (0) 2020.12.12
PLT & GOT 간단하게 정리.  (0) 2020.08.21

FSB 공부를 하며 FSB에 관한 문제를 더 풀어보고 정리하고 싶어서 메모에다가 남긴다.

 

먼저, 파일을 다운받고 IDA로 열어서 코드를 확인해보자.

 

main()
init()

main함수에 printf(&buf) 부분에서 FSB 취약점이 터지는걸 확인할 수 있다.

 

함수를 살펴보면,

 

hide()

hide라고 아주 수상하게 생긴 함수가 존재한다.

 

/bin/sh

hide 함수를 이용해서 해결하면 될 것 같다.

 

우분투에서 한번 실행해보자.

 

처음 입력한 AAAA가 포맷 스트링을 입력한 후로 4번째에 hex 값으로 출력이 되었다.

 

그렇다면, 순서는 이렇다.

 

1. read 함수로 입력을 받을 때 앞 부분에 exit 함수의 GOT 주소를 넣어준다.

 

2. %hn (%n)을 활용해서 처음에 넣은 exit_GOT 주소위치에 hide 함수의 주소를 넣도록 조작한다.

 

※ %hn은 %n과 다르게 2byte씩 들어간다.

 

 

먼저, hide의 주소와 exit의 GOT주소를 구해보자.

hide() address
exit() GOT address 

두 개의 주소를 구했다.

 

3가지 방법으로 익스를 짜볼 것이다.. 

 

먼저, %n을 써서 짜보자!

 

 

hide 주소인 0x080485b3을 10진수로 바꿔주고 앞에 got 주소가 4byte였기 때문에 -4를 해준다.

 

그리고 %4$n에서 4$는 오프셋이다.

 

이렇게 익스를 하면 시간이 조금 걸린다.

 

flag

 

 

두 번째로 %hn을 써서 익스를 짜보자.

 

기본 문자열 개수는 GOT - 2와 GOT 주소인 "\x16\xa0\x04\x08" + "\x18\xa0\x04\x08" = 8byte 이다.

 

잘 이해가 되지 않는다면 이 글을 보면 도움이 될 것 같다..

 

http://kaspyx.tistory.com/82

 

포맷 스트링 버그(format string bug) 공격시에 플래그(flag)사용하기

/* written by kaspy (kaspyx@gmail.com) */ 이전에 잠시 공부한적이 있지만, 까먹고있다가 이참에 공부해서 정리하게되었다. 포맷 스트링 버그 취약점을 가진 프로그램이 있을때, $-flag를 이용한 공격이 기

kaspyx.tistory.com

flag

똑같이 익스가 터진걸 볼 수 있다.

 

 

 

세 번째로는 pwntools가 제공하는 FSB 저격 함수를 사용해서 익스를 짜보자!

 

이 함수를 알고난 뒤로는 웬만해서는 앞의 방법들로 FSB 문제를 풀지 않을 것 같다.

 

익스를 짜보자.

 

fmtstr_payload()

정말,, fmtstr_payload() 함수가 귀찮은 일들을 한번에 다 해결 해준다..

 

fmtstr_payload() 함수에 대해 더 자세히 알고싶다면 pwntools 기술문서에 가서 더 알아보자.

 

docs.pwntools.com/en/stable/fmtstr.html#pwnlib.fmtstr.fmtstr_payload

 

pwnlib.fmtstr — Format string bug exploitation tools — pwntools 4.3.1 documentation

A tuple (score, value, mask) where score equals the number of matching bytes between the returned value and target.

docs.pwntools.com

 

성공적으로 익스가 됐다.

 

플래그는 YCTF{S1mPl3_1s_tH3_b3sT} 이다.

 

 

'메모용' 카테고리의 다른 글

ASLR 정리  (0) 2021.08.24
메모리 보호 기법 [ NX-Bit(MS : DEP) ]  (0) 2020.12.18
PLT & GOT 간단하게 정리.  (0) 2020.08.21

자료는 블랙펄시큐리티 블로그의 내용을 참고해서 메모했다. https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

 

  • PLT (Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블이다. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다.

  • GOT (Global Offset Table) : PLT가 참조하는 테이블이다. 프로시저들의 주소가 들어있다.


기본적으로 함수를 호출하면(PLT를 호출) GOT로 점프하는데 GOT에는 함수의 실제 주소가 쓰여있다.첫 번째 호출이라면 GOT는 함수의 주소를 가지고 있지 않고, '어떤 과정'을 거쳐 주소를 알아낸다. 두 번째 호출 부터는 첫 번째 호출 때 '어떤 과정'으로 알아낸 주소에 바로 점프한다.


여기서 우리가 봐야할 것은 '어떤 과정'이다. 이 과정을 통해 GOT가 주소를 알아낸다. 이 '어떤과정'은 무엇일까?

 

먼저, 링킹(Linking)에 대해 알아보자.

 - 링킹은  라이브러리 등과 같은 소스코드에 필요한 오브젝트 파일들을 연결시키는 작업을 링킹이라고 한다.

 

링크를 하는 방법에도 Static 방식Dynamic 방식이 있다.

  • Static Link 방식은 파일 생성시 라이브러리 내용을 포함한 실행파일을 만든다.

gcc -o test test.c -static

 - gcc 옵션 중 static 옵션을 적용해서 컴파일을 하면 Static Link 방식으로 컴파일이 된다.

 

  • Dynamic Link 방식은 라이브러리를 하나의 메모리 공간에 매핑하고 여러 프로그램에서 공유하는 공유 라이브러리를 사용한다. 

gcc -o test test.c

 - 아무런 옵션도 주지 않는다면, 자동으로 Dynamic Link 방식으로 컴파일 한다.

 


여기서!!!

Dynamic Link 방식으로 컴파일을 했을 때 PLT와 GOT를 사용하게 된다.

 

 Static Link 방식으로 컴파일을 하면 라이브러리가 실행파일 내부에 있기 때문에 함수의 주소를 알아내는 과정이 필요가 없지만, Dynamic Link 방식으로 컴파일을 하면 라이브러리가 프로그램 외부 메모리에 위치해 있기 때문에 함수의 주소를 알아오는 과정이 필요한 것이다.


원리

 Dynamic Link 방식으로 프로그램이 만들어지면 함수를 호출할 때 PLT를 참조하게 된다. PLT에서는 GOT로 점프를 하게 되는데, GOT에 라이브러리에 존재하는 실제 함수의 주소가 적혀있어 함수 호출이 가능하다.

 이 때, 첫 번째 호출이라면 GOT에 실제함수의 주소가 쓰여있지 않다. 그래서 첫 호출을 할 때는 Linker가 dl_resolve라는 함수를 사용해 필요한 함수의 주소를 알아오고, GOT에 그 주소를 써준 후 해당 함수를 호출한다.

 그리고 두 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있어 바로 호출하면 된다!

'메모용' 카테고리의 다른 글

ASLR 정리  (0) 2021.08.24
메모리 보호 기법 [ NX-Bit(MS : DEP) ]  (0) 2020.12.18
Format String Bug - simplefsb (Y.CTF)  (0) 2020.12.12

+ Recent posts