관리 메뉴

개발자비행일지

모의해킹 시스템해킹 리눅스 NOP Sled 본문

카테고리 없음

모의해킹 시스템해킹 리눅스 NOP Sled

Cyber0946 2020. 2. 21. 14:29

https://dreamhack.io/learn/2#19

#이 사이트를 참고하여 개인 학습을 위해 정리한 자료입니다. 

 

로그인 | DreamHack

 

dreamhack.io

RET Overwrite Exploitation

앞서 RET Overwrite Exploitation통해서 gdb로 이용해 수행한 공격을 셸 환겨에서 실행해보면 다음과 같은 세그먼트 폴트를 만날 수 있다.

셸을 획득하지 못 하고 프로그램이 비정상 종료되었는데 이것은 위 익스플로잇 코드에 있는  리턴 주소를 스택에 있는 셸코드의 주소로 덮습니다. 하지만 익스플로잇이 제대로 동작하지 않은 이유는 스택의 셸코드의 주소가 바뀌었기 때문입니다.

프로그램을 다른 환경에서 실행시킬 때 지역 변수의 주소는 스택 끝에 존재하는 프로그램의 인자와 환경변수에 따라 변합니다.

우리가 앞서실행한 gdb는 프로그램을 실행할 때 실팽 파일의 절대경로를 argv[0]에 저장하지만,

셸에서 프로그램을 실행할 때는 사용자가 입력한 경로가 argv[0]에 저장된다. 

그렇기 때문에  스택 주소에 오차가 생기고, 이로 인해 우리가 작성한 공격코드가 무용지물이 된다. 

왜냐하면 코드가 메모리에 올라가야 실행되는 것이 컴퓨터의 구조

폰노이만 구조이기 때문이다. 

NOP SLED

NOP는 "No Operation"의 약자로, 어셈블리 명령어 중의 하나이다. NOP은 xchg, eax, eax와 같이 프로그램의 실행에 영향을 주지 않는 명령어이기 때문에, 프로그램이 실행중에 NOP 명령어를 만나면 바로 다음 명령어로 넘어가도록 해준다. 

NOP명령어는 주로 명령어의 주소 alignment를 맞출 때 사용한다. 

즉, NOP로 길을 만들어서 실제 명령 주소가 있는 부분이 나올 때 까지 보내는거다. 

x86 구조에서 NOP 명령어 바이트 코드는 0x90이다.

NOP Sled 기법은 주로 셸코드의 주소를 정확히 알아내기 힘들 경우 큰 메모리를 확보하여 셸코드 주소의 오차 범위를 크게 만들 때 사용한다.

예를 들어, 0x100 주소에 셸코드가 저장되어 있다고 가정해 보겠다. 만약 NOP Sled 가 없다면 정호가히 0x100 주소로 실행 흐름을 바꿔야 셸코드가 실행된다. 하지만 셸코드 앞에 0x10000바이트의 NOP Sled를 붙인다면 0x100~0x10100 의 주소 중 임의의 주소로 실행 흐름을 바꾸기만 하면 된다. NOP Sled의 어딘가의 주소를 알아내 달라진 환경에 해당하는 주소로 실행흐름을 바꾸는 경우 평균적으로 0x10000/2만큼의 주소 오차가 허용된다.

NOPSLED  예제

1. 앞서 제작한 코드를 gdb에서 실한 한 뒤 취약점이 있는 함수인 vuln을 디스어셈블한다.

2. 디스어셈블 한 것을 보고 strcpy를 호출하는 시점은 vuln+44 지점에 b *vuln+44 명령으로 브레이크 포인트를 설정해 준다. 

3. 이제 실행 시킨다. 이때, 앞과 같이 파이썬을 사용해 좀 더 쉽게 문자열을 vuln에 인수로 전달해 준다.  사이트에서 나와 있는 명령 내용을 틀렸다. 제대로 동작하지 않는다. 이걸로 3시간은 잡아 먹었다. 

4. x/2wx $esp 명령을 통해서 strcpy를 호출하는 시점에 매개변수로 스택에 들어가 잇는 매개변수 들의 주소를 확인한다.

아래의 코드를 보면 strcpy에는 buf, src를 매개변수로 하는데 이를 보면  먼저 나온게 buf의 주소고 그 다음이 argv[1]의 주소가 됨을 알 수 있고, 이 주소는 0xbffe6c2d이다. 

5. 해당 주소의 주변에는 다음과 같은 문자들이 채워져 있다. 

6. 다음으로 NOP Sled 중간 지점의 주소를 계산해 보자

7.이를 활용해서 새로운 공격 코드를 만들어 보자.

"A"*36 + 0xbfff2f7d+"\x90"*100000 +shellcode

./exampl1 `python -c ‘print "A"*36 +"\x7d\x2f\xff\xbf“ +"\x90"*100000 + \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x31\xd2\xb0\x0b\xcd\x80”’`

'print