var q='PGRpdiBjbGFzcz0ib3ZlciI+PGRpdj4iSSBzaW5jZXJlbHkgYmVsaWV2ZSB0aGF0IGJhbmtpbmcgZXN0YWJsaXNobWVudHMgYXJlIG1vcmUgZGFuZ2Vyb3VzIHRoYW4gc3RhbmRpbmcgYXJtaWVzLCBhbmQgdGhhdCB0aGUgcHJpbmNpcGxlIG9mIHNwZW5kaW5nIG1vbmV5IHRvIGJlIHBhaWQgYnkgcG9zdGVyaXR5LCB1bmRlciB0aGUgbmFtZSBvZiBmdW5kaW5nLCBpcyBidXQgc3dpbmRsaW5nIGZ1dHVyaXR5IG9uIGEgbGFyZ2Ugc2NhbGUuIjwvZGl2PjxkaXYgY2xhc3M9ImF1dGhvciI+LSBUaG9tYXMgSmVmZmVyc29uPC9zcGFuPjwvZGl2PjwvZGl2Pg==';
I sincerely believe that banking establishments are more dangerous than standing armies, and that the principle of spending money to be paid by posterity, under the name of funding, is but swindling futurity on a large scale.
흔히 Buffer Overflow 공격으로부터 보호하기 위해 Stack, Heap, Libc, 프로세스 주소 공간을 포함하는 데이터 영역 위치들을 랜덤하게 변경하여 메모리의 특정 악용 함수 주소를 랜덤하게 하여 공격을 방지를 할 수 있게 하는 녀석입니다.
실제로 이 ASLR이 작동을 하는지 눈으로 확인을 하도록 하겠습니다.
cat /proc/self/maps 명령을 입력을 하여 직접 확인해보도록 하세요!
앙 바뀐띄~
이 ASLR이 적용이 되있는지 안되있는지 확인하는 방법은 아래와 같습니다.
cat /proc/sys/kernel/randomize_va_space
0 : No randomization. Everything is static.
1 : Conservative randomization. Shared libraries, stack, mmap(), VDSO and heap are randomized.
2 : Full randomization. In addition to elements listed in the previous point, memory managed through brk() is also randomized.
그렇다면 이 ASLR을 해제를 해보도록 하겠습니다.
echo 0 > /proc/sys/kernel/randomize_va_space
보시는 것과 같이 주소 값이 바뀌지 않는 것을 볼 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *heap = NULL;
heap = (char*) malloc(50);
printf("[Heap Address] : %p\n", heap);
return 0;
}
간단한 코드로 주소를 출력을 해보도록 하겠습니다.
gcc -o a a.c
왼쪽은 ASLR을 끈 상태이며 오른쪽은 ASLR이 적용되있는 상황입니다.
보시는 것과 같이 ASLR이 적용되있지 않을 때에는 힙의 주소 값이 일정하지만 ASLR이 켜져있을 경우에는 주소 값이 랜덤하게 바뀌는 것을 볼 수 있습니다.
2. DEP (Data Execution Prevention)
DEP라는 녀석에 대해 알아보도록 하겠습니다.
네, 그렇습니다!
흔히 Overflow로 인해 메모리 영역에 훼손이 발생하더라도, Data 영역에서 실행(Execution)을 방지함으로써 공격을 방어하는 기법입니다.
고로 해커가 Buffer Overflow 공격으로 ret을 스택영역에 놓은 쉘코드 주소로 변경했을 때에 DEP가 적용이 안되있는 경우에는 그대로 쉘코드가 실행이 되어 쉘을 딸 수 있겠지만, DEP가 적용이 되어있다면 실행 권한이 없으므로 쉘코드가 실행되지 않고 종료가 됩니다.