목록전체 글 (33)
미역줄기의 이모저모
후킹(hooking) 운영체제가 어떤 코드를 실행하려 할 때, 이를 낚아채어 다른 코드가 실행되게 하는 것이다. 이때 실행되는 코드를 훅(Hook)이라고 부른다. 후킹의 용도 함수에 훅을 심어서 함수의 호출을 모니터링한다. 함수에 기능을 추가한다. 아예 다른 코드를 심어서 실행 흐름을 변조시킨다. 훅 오버라이트 malloc()과 free() 를 호출할 때 함께 호출되는 훅이 함수 포인터 형태로 존재한다. 이 함수 포인터를 임의의 함수 주소로 오버라이트하여 악의 적인 코드를 실행하는 기법이다. Full RELRO를 우회하는 기법이다. 원가젯 단일 가젯만으로도 셸을 실행할 수 있는 매우 강력한 가젯이다. malloc, free, realloc, hook c언어에서 메모리의 동적 할당과 해제를 담당하는 함수 ..

문제설명 코드 분석 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } char형 버퍼에 0x40 만큼 할당했다. read를 보면 버퍼..

문제 설명 본격 적인 분석 전에 checksec으로 보호기법을 확인한다. x86-64 아키텍처. canary가 없다. NX가 적용되었다. PIE 없다. canary가 없다 == SFP, ret와 그 뒷 주소를 마음대로 변경해도 프로세스 종료가 안 된다! NX 걸려있다 == 셸코드 사용이 어렵다 == return oriented programming 기법을 사용하자!PIE가 적용되지 않았다 == 바이너리가 실행되는 메모리 주소가 랜덤화하지 않는다. 코드 분석 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0)..

ROP(Return Oriented Programming) ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소를 계산해야한다. ROP는 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법이다. ROP 페이로드는 리턴 가젯으로 구성되는데, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP chain이라고 불린다. 페이로드 작성 과정을 보면,, chain이라고 한 이유가 다 있다.... 문제 들어가기 전 복습 1. plt에는 got 엔트리의 주소가 적혀있고 got에는 해당 함수의 실제 주소가 적혀있다. 2. ASLR이 적용되면 실행할 때마다 스택, 힙, libc_base의 주소가 ..

프로세스에 실행 권한이 있는 메모리 영역은 일반적으로 바이너리의 코드 영역과 바이너리가 참조하는 라이브러리의 코드 영역이다. 공격자들을 libc의 함수들로 NX를 우회하고 셸을 획득하는 공격 기법을 개발하였다. 이를 Return To Libc 라고 한다. 문제 코드 #include #include #include const char* binsh = "/bin/sh"; int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt'"); // Leak canary printf("[1] Leak Ca..

링크 링크는 컴파일의 마지막 단계로 알려져있다. 프로그램에서 어떤 라이브러리의 함수를 사용한다면, 호출된 함수와 실제 라이브러리의 함수가 링크 과정에서 연결된다. 리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐 ELF형식을 갖춘 오브젝트 파일로 번역된다. 오브젝트 파일은 실행 가능한 형식을 갖추고 있지만, 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능하다. 링크를 거치고 나면 프로그램에서 함수를 호출할 때, 함수의 정의가 있는 라이브러리에서 함수의 코드를 찾고 해당 코드를 실행하게 된다. 라이브러리와 링크의 종류 동적 라이브러리를 링크하는 동적 링크, 정적 라이브러리를 링크하는 정적 링크로 나뉜다. 동적 링크 프로그램을 사람, 라이브러리를 도서관이라고 비유했을 때, ..

NX nx는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호기법이다. 어떤 메모리 영역에 대해 쓰기 권한과 실행 권한이 함께 있으면 취약해지기 쉽다. CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NS를 적용할 수있다. 그럼 각 메모리 영역에 필요한 권한만을 부여받을 수 있다. checksec을 이용해서 NX를 확인할 수 있다. NX를 intel은 XD, AMD는 NX, 윈도우는 DEP, ARM에서는 XN이라고 칭한다. Return to Shellcode w/t NX r2s에 NX 보호기법을 적용한 후, 동일한 익스플로잇을 실행해본다. r2s.c를 -zexecstack 옵션을 제거해 컴파일하고, checksec으로 확인해보면 NX가 활성화되어 있다. $ checkse..

문제코드 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } void print_box(unsigned char *box, int idx) { printf("Element of index %d is : %02x\n", idx, box[idx]); } void menu() { puts("[F]ill..