쉘 코드를 사용해 보고 싶고 Linux 보호를 비활성화하고 싶습니다.
플래그를 사용하여 컴파일할 수 있다는 것을 알고 있지만 이러한 보호를 비활성화하는 다른 방법이 있다는 것을 알고 있지만 기억이 나지 않습니다. 도와주세요?
답변1
vonbrand(오른쪽, +1)가 말한 내용을 확장하면 Linux의 스택 보호는 두 부분으로 나뉩니다.
스택 카나리아
스택 카나리아는 vonbrand가 컴파일러 적용 기능이라고 부르는 것입니다. 이러한 기능은 다시 컴파일하지 않고는 비활성화할 수 없습니다.
이를 스스로 증명하고 작동 방식을 이해하려면 다음 코드를 사용하십시오.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int mybadfunction(char* a_bad_idea)
{
char what[100];
strcpy(what, a_bad_idea);
printf("You passed %s\n", what);
}
int main(int argc, char** argv)
{
printf("Tralalalaala\n");
mybadfunction(argv[1]);
}
이제 gcc -fstack-protector -masm=intel -S test.c
gnu 항목으로 compile()을 실행하면 출력을 행복하게 조립하고 읽을 수 있습니다. 중요한 점은 함수를 종료할 때 다음 mybadfunction
과 같은 작은 코드 조각이 있다는 것입니다.
mov edx, DWORD PTR [ebp-12]
xor edx, DWORD PTR gs:20
je .L2
call __stack_chk_fail
추측할 수 있듯이 이는 에서 스택 쿠키를 가져 [ebp-12]
와서 의 값과 비교하는 것입니다 gs:20
. 불일치? 그런 다음 glibc에서 함수를 호출하여 __stack_chk_fail
프로그램을 종료합니다.
Exploit을 작성하여 이 문제를 해결하는 방법은 다양하지만 쉘코드 테스트 케이스를 구축하는 가장 쉬운 방법은 -fno-stack-protector
.
실행할 수 없는 페이지
최신 Linux 시스템에는 몇 가지 다른 고려 사항이 있습니다. 일반적인 쉘코드 테스트 스텁을 사용하는 경우:
char buffer[] = {...};
typedef void (* func)(void);
int main(int argc, char** argv)
{
func f = (func) buffer;
f();
return 0;
}
.rodata
최신 GCC/Linux는 실행 권한 없이 PE 파일의 읽기 전용 부분을 매핑합니다 . 이 기능을 꺼야 합니다. 다음 코드 예제를 사용하면 됩니다.이 블로그 게시물. 기본 개념: mprotect
쉘코드 데이터가 있는 페이지에 원하는 권한을 추가할 수 있습니다.
실행 불가능한 스택
쉘코드를 사용하여 기존 공격 시나리오(예: 위의 오류 코드)를 테스트하는 경우 간단한 경우에 대해 스택을 실행할 수 있는지도 확인해야 합니다. PE 파일 형식에는 스택이 실행 가능한지 여부를 결정하는 필드가 포함되어 있습니다. 다음을 사용하여 이를 쿼리하고 제어할 수 있습니다.실행 스택. 실행 가능 스택을 활성화하려면 다음을 실행하십시오.
execstack -s /path/to/myprog
이것할 수 있는재컴파일 없이 모든 프로그램에서 이 작업을 수행할 수 있지만 스택 카나리아는 컴파일 타임에 내장되므로 자동으로 비활성화되지 않습니다.
보너스: aslr:
이 기능을 끄려면 echo 0 > /proc/sys/kernel/randomize_va_space
.
방금 내 소중한 펭귄 사용법을 누군가에게 알려줬나요?
아니요. 모든 익스플로잇은 스택 카나리아(매우 중요)를 피해 execstack
이를 설정하는 세트가 있는 프로그램을 찾거나(이미 임의의 명령을 실행할 수 있음을 의미) libc /return 지향 프로그래밍 반환과 같은 더 어려운 기술을 사용해야 합니다.
답변2
스택 보호는 컴파일러에 의해 수행됩니다(스택에 일부 추가 데이터를 추가하고 호출 시 일부 데이터를 저장하고 반환 시 무결성을 확인함). 다시 컴파일하지 않고는 비활성화할 수 없습니다. 그게 요점의 일부입니다. 정말...
답변3
이러한 옵션을 사용하여 특정 보호(스택 스매싱 감지 및 스택 실행 가능 만들기)를 비활성화할 수 있습니다.
--z execstack
-f no-stack-protector
다음 명령을 사용하여 Bash를 사용하여 ASLR(Address Space Layout Randomization)을 끌 수도 있습니다.
echo 0 > /proc/sys/kernel/randomize_va_space