본문 바로가기
잡동사니

SEED 고급해킹실습 Lab2 [RTL 공격]

by L3m0n S0ju 2022. 3. 26.

Lab2_Stack Overflow_.pdf
0.19MB

 

 

 

 

Task1

 

Purpose: 쉘코드를 한번 사용해본다.

 

 

위 그림과 같이 call_shellcode를 실행하면 seed의 계정으로 쉘이 실행된다. 쉘 코드는 execve

수를 이용해서 /bin/sh 명령어를 실행하는 코드를 쉘코드로 작성한 것이라고 한다.

 

 

 

 

 

위 그림과 같이 stack.c에 여러가지 옵션을 줘서 counter measure들을 제거하고 DBUF 사이즈는 77로 설정하여 컴파일을 진행하였다. 계정은 root, 권한은 set-uid를 적용했다.

 

 

 

 

문제에서 주어진 stack.c badfile에서 데이터를 읽어들어 strcpy 함수를 이용해서 bof 함수의 스택 공간에 저장하는데 strcpy는 스택오버플로우에 취약한 함수로 사용하면 안된다. 이후 Task2에서 badfile 만드는 코드를 작성할 것이다

 

 

 

 

 

 


Task2

 

Purpose: stack 프로그램을 exploit 하기

 

문제에서 주어진 exploit.c의 아래와 같은 코드를 채워넣는다.

/* You need to fill the buffer with appropriate contents here */
  /* ... Put your code here ... */
 
 
  strcpy(buffer+0x59, "\xbf\xec\xff\xbf");
  strcpy(buffer + 517 - strlen(shellcode), shellcode);
 
/* Save the contents to the file "badfile" */

 

 

 

 

 

0x080484f7 주소를 보면 eax [ebp-0x55] 를 저장하는데 이를 통해 버퍼와 ebp사이의 거리가 0x55만큼, 10진수로 85만큼 떨어져있으므로 sfp 4바이트를 더해서 89바이트 만큼 이동하면 ret의 주소가 된다.

 

 

 

 

 

 

 

이제 ret에 덮어씌울 쉘코드의 주소를 찾야야 되는데 쉘코드는 517의 마지막 부분에 저장하고 중간은 NOP Sled 덮어씌어져 있기 때문에 적당히 0xbfffecbf ret에 덮어씌우면 쉘코드를 실행할 수 있다.

 

 

 

 

 

 

 

위 그림과 같이 euid root 권한인 쉘을 획득할 수 있다.

 

 

 

 

 

 

 

 


 Task3

 

Purpose: /bin/dash /bin/zh 차이 알아보기

 

 

 

문제에서 주어진 코드에 주석을 나두고 컴파일한 후 실행하면 set-uid가 적용되지 않는다.

 

 

 

 

 

 

set-uid(0)을 실행하면 set-uid가 적용되어 root 쉘을 획득할 수 있다.

 

 

 

 

 

 

 

 

추가된 쉘코드를 Task2 exploit.c에 추가한 후 컴파일 한다.

 

 

 

 

 

 

 

새로운 exploit으로 badfile을 만들어서 ./stack을 실행하면 root 권한의 쉘을 획득할 수 있다.

 

 

 

 

 

 

consideration

 

dash 쉘도 우회방법을 통해서 set-uid 권한 상승과 함께 쉘을 탈취할 수 있었다.

 

 

 

 

 

 

 

 

 


Task4

Purpose: ALSR 보호기법 우회하기

 

sudo /sbin/sysctl -w kernel.randomize_va_space=2

 

위 명령어를 실행하면 ASLR이 실행되어 프로그램을 실행하면 스택과, 힙의 주소가 랜덤으로 배정되기 때문에 gdb로 주소를 확인해도 다음 프로그램 실행할 때 주소가 바뀌어 아래와 같이 stack프로그램을 실행해도 Segmentation fault가 일어난다.

 

 

 

 

 

 

대략 9시간을 돌렸는데 쉘 탈취에 실패했다. 위 그림과 같이 ASLR을 끄고 스크립트를 실행하면 바로 루트 쉘이 실행되므로 설정 상에 오류는 없는 것 같으나 시간이 너무 오래 걸려서 중단했다.

 

 

 

 

 

 

 

 


Task5

Purpose: Stack Guard 보호 기법을 사용해본다.

 

 

task2에서 fno-stack-protector 옵션을 제거하고 stack.c를 컴파일하면 프로그램에 카나리가 적용되어 스택의 어느 랜덤한 위치에 카나리가 저장된다. 해당 카나리가 프로그램 시작할 때와 다르게 변경될 경우 에러가 발생하며 프로그램을 종료하는 보호기법이다.

 

 

 

 

 

 

 

 

위 그림과 같이 stack을 실행하면 stack guard 보호기법이 적용되어 stack smashing이 탐지되어 프로그램이 종료된다.

 

 

 

 

 

 

 

 


 

Task6

 

Purpose: NX(Non-eXcutable stack) 보호기법 사용해본다.

 

noexecstack 옵션을 적용하면 스택에서 코드 실행이 불가능해진다. 따라서 아래 그림처럼 stack을 실행하면 Segmentation fault 오류가 발생한다. badfile을 스택에 덮어씌어서 쉘코드를 실행하는 방식이지만 스택은 코드 실행이 불가능하므로 프로그램은 오류가 발생하게 된다.

 

 

 

 

 

'잡동사니' 카테고리의 다른 글

이미지 생성형 AI 활용  (0) 2024.12.01
git 정리  (0) 2022.11.06
SEED 고급해킹실습 Lab1 [LD_PRELOAD 후킹 공격]  (0) 2022.03.26
에이티식스 리뷰  (0) 2022.01.28
목소리의 형태 리뷰  (0) 2022.01.02

댓글