분석 vars typedef struct addr_t { size_t start_addr; size_t end_addr; } addr_t; addr_t* p = NULL; 전역으로 선언된 구조체 포인터 p 가 있다. main int main() { size_t num = 0; char name[0x10] = {0, }; void (*func_ptr)(void) = NULL; initialize(); get_libc_code_addr(); printf("[+] What is your name?\n> "); read(0, name, sizeof(name)-1); printf("Hello %s\nI will give you gift\n> "); scanf("%llu", &num); func_ptr = (num..
분류 전체보기
Address Space LAyout Randomization rtl 공격을 어렵게 할 수 있다. 라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤한 영역에 배치하여, 공격에 필요한 Target Address 를 예측하기 어렵게 만든다. NX bit 는 바이너리의 컴파일 옵션에 따라 적용 여부가 결정되지만 ALSR 은 서버의 설정 파일에 의해 보호 기법의 적용이 결정된다. 기본적으로 ASLR 은 비활성화 되어있다. ASLR 은 데이터영역만 무작위화 시킨다. 메모리의 처음 부분에 정해지지 않은 크기의 공간을 추가하거나, 메모리의 섹션을 재배치하는 방식을 사용 장점 직접적인 메모리 참조가 힘들어진다. 단점 주소의 Image Base, 즉 시작 주소만 바뀐다. VA(절대 주소) = Ima..
Shared Library 컴파일을 하면 오브젝트 파일이 생성된다. 하지만 오브젝트 파일은 그 자체로 실행이 가능하지는 않다. Printf의 구현 코드를 모르기 때문에 printf 를 호출 했을 때 어떤 코드를 실행해야 하는지, printf 를 호출 하기 위해서는 printf 의 구현체를 연결해야 한다. printf 의 실행 코드는 printf의 구현 코드를 컴파일한 오브젝트 파일로, 이런 오브젝트 파일들이 모여있는 곳을 라이브러리(Library) 라고 한다. 라이브러리 등 필요한 오브젝트 파일들을 연결시키는 작업을 링킹(Linking) 이라고 한다. 이렇게 링크 과정까지 마치면 최정적인 실행 파일이 생긴다 링크를 하는 방법에는 Static 과 Dynamic 방식이 있다. Static Static 으로 ..
tistoryBlogName: lmxx tistoryTitle: “[TOOR] 7. Lazy Binding & Now Binding” tistoryTags: “” tistoryVisibility: “0” tistoryCategory: “1189856” tistorySkipModal: true tistoryPublished: “” tistoryPostId: “28” tistoryPostUrl: https://lmxx.tistory.com/28 no relro 했는데 왜 Full Relro norelro 로 컴파일 해서 최초 실행인데 왜 바인딩이 돼있지? partial Relro 로 하려고 -z relro 옵션으로 컴파일 했는데 계속 Full Relro 여서 보니까 PIE 가 켜져있으면 Full Relro ..
What is Canary canary 는 광부들이 광산에 들어갈 때 카나리아라는 새를 데리고 내려간 것에 유래 해서 이름이 지어졌다. 카니리아는 환경에 민감하기 때문에 광산에서 나오는 유독 가스들에 민감하게 반응했고 이를 이용해 광부들은 안전하게 일할 수 있엇다. 보호기법으로서의 Canary 도 이와 비슷하다. Canary 는 buffer 와 SFP 사이에 삽입이 된다. BOF 가 발생하면 Canary 값이 손상되고, Canary 데이터의 검증에 실패하여 오버플로우에 의한 공격을 방어할 수 있다. Canary의 종류 Terminator Canary Canary의 값을 문자열의 끝을 나타내는 문자들을 이용해 생성한다. 예를 들어 NULL(0x00), CR(0x0d), LF(0x0a) 및 EOF(0xff)..
link [TOOR] 5.3. Shell Code [TOOR] 5.1. BOF (내 안의 버퍼가 넘친다!) checksec skip vuln void main(int argc, char *argv[]) { char *shellcode = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); void (*sc)(); init(); banned_execve(); printf("shellcode: "); read(0, shellcode, 0x1000); sc = (void *)shellcode; sc(); } 셸코드를 입력 받아서 실행시켜주는 프로그램. exploit method banned_exec..
Shell Code 는 작은 크기의 코드로 메모리에 업로드 되어 명령어 실행이 가능한 코드를 말한다 . 셸코드 라고 불리는 까닭은 일반적으로 셸을 획득하고 거기서 부터 공격자가 후속 공격을 하기 때문이라고 한다. Shell Code 만들기 x86 기준으로 만들어 보겠다. 셸코드를 만드는 방법은 우선 원하는 기능을 c로 구현해야 한다. #include void main() { char * shell[2]; shell[0] = "/bin/sh"; shell[1] = NULL; execve(shell[0], shell, NULL); } 이건 execve 함수로 /bin/sh 를 실행하는 프로그램이다. 셸코드를 만들기 위해 필요한 것은 /bin/sh 와 execve 이다. int execve( const cha..
데이터 영역의 실행권한을 제거하는 기법이다. 리눅스 커널 5.4.0 미만 버전에서는 스택 뿐만 아니라 힙, 데이터 영역 등 읽기 권한이 있는 모든 페이지에 실행 권한을 부여했다. 5.4.0 이상 버전의 커널은 로더가 따로 스택 영역에만 실행 권한을 부여한다. 대충 짜서 테스트 해 봤다. # include int main() { int a = 10; char * ma = malloc(0x10); printf("%d", a); } gcc -z execstack 으로 NXbit 보호기법을 제거할 수 있다. 기본으로 컴파일하면 NX가 부여되어 있다. nonnx vmmap 으로 보면 stack 에 실행 권한이 있음을 알 수 있다. 앞서 기술 했듯이 5.4.0 이상 버전이라 스택 영역에만 실행권한이 있다. onNX..