본문 바로가기

분류 전체보기

(69)
[Wargame] basic_exploitation_003 1. 실습 코드 #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"); } int main(int argc, char *argv[]) { char *heap_buf = (char *)malloc(0x80); char stack_buf[0x90] = {}; initialize(); read(0, heap_..
[Wargame] basic_exploitation_002 1. 실습 코드 #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"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); read(0, buf, 0x80); printf(buf); exit(0); } 2. 코드 분석 initialize..
[Lecture] Format String Bug (FSB) 1. 포맷 스트링 버그 (Format String Bug, FSB) 포맷 스트링을 인자로 사용하는 함수는 대표적으로 scanf, fprintf, fscanf, sprintf, sscanf가 있다. 포맷 스트링을 채울 값들은 레지스터나, 스택에서 가져온다. 하지만, 포맷 스트링을 사용하는 함수의 내부에는 필요로 하는 인자 개수와 함수에 전달된 인자의 개수를 비교하는 루틴이 존재하지 않는다. 포맷 스트링을 사용자가 입력할 수 있을 때, 공격자는 레지스터와 스택을 읽을 수 있고, 임의 주소 읽기 및 쓰기를 할 수 있다. 포맷 스트링 함수를 잘못 사용하여, 발생하는 버그를 "포맷 스트링 버그"라고 한다. 2. 레지스터 및 스택 읽기 2-1. 실습 코드 사용자가 임의의 포맷 스트링을 입력할 수 있는 코드이다. s..
[Wargame] out_of_bound 1. 실습 코드 #include #include #include #include #include char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; 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 idx; initialize(); printf("Admin name: "); read(0, name, sizeof(..
[Lecture] OOB (Out of bounds) 1. 배열의 속성 배열은 연속된 메모리 공간을 점유하며, 배열의 각 요소의 주소는 배열의 주소, 요소의 인덱스, 요소 자료형 크기를 이용하여 계산한다. 배열이 점유하는 공간의 크기는 요소의 개수와 요소 자료형의 크기를 곱한 값이며, 배열이 포함하는 요소의 개수를 배열의 길이라고 한다. // array[n]의 배열 크기 sizeof(array) = sizeof(elem) * n // array[n]의 k번째 배열을 참조 &array[k] = array + sizeof(elem) * k 2. OOB 2-1. 정의 배열의 임의 인덱스에 접근이 가능하여, 악의적으로 배열의 경계를 넘어 값을 읽거나 쓸 수 있는 취약점이다. 배열 참조에 사용되는 인데스를 임의 값으로 설정할 수 있다면, 배열의 주소로부터 특정 오프..
[stack unlimited, control esp] fix 1. 문제 ssh로 접속할 수 있는 정보가 주어진다. 2. 코드 분석 2-1. fix.c shellcode함수에서 sc의 shellcode를 buf에 copy 한다. buf의 RET에 buf를 넣음으로써, buf에 들은 shellcode가 실행되는 것으로 보인다. #include // 23byte shellcode from http://shell-storm.org/shellcode/files/shellcode-827.php char sc[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; void shellcode(){ // a buffer we are about to ex..
[Fake EBP] simple login 1. 문제 login 바이너리 파일 다운로드할 수 있는 링크가 주어진다. nc로 접속할 수 있는 정보가 주어진다. 2. 코드 분석 IDA와 gdb를 이용하여, 분석하였다. (본 글은 문제 푸는데, 필요한 부분만 작성하였다.) 2-1. main 함수 code 11줄 : 30글자를 입력받아오고 있는 것을 확인할 수 있다. code 14줄 : 입력값과 v4가 Base64Decode함수의 인자값으로 넘어가며, return된 값이 v6에 저장된다. code 15줄 : v6가 0xC보다 크면, "Wrong Length"가 출력되고 프로그램이 종료된다. code 26줄 : auth인자값으로 v6가 넘어가고, 조건문이 true일 경우, correct함수가 실행된다. 2-2. Base64Decode 함수 두 번째 인자로..
Fake EBP 1. Fake EBP란? IP(Instruction Pointer)를 조작하는 공격 기법을 말한다. leave-ret Gadget을 이용하여, 조작할 수 있다. 2. Fake EBP는 언제 사용? RET를 스택주소나 라이브러리 주소로 덮어쓸 수 없을 경우에 사용되는 기법이다. 3. Fake EBP 기법 공부 전, 알고 가기 함수 에필로그에 대해서 알고 있어야 한다. (본 글에서는 함수 에필로그에 대해 자세한 설명을 포함하고 있지 않으며, 알고 있는 것으로 가정하여 작성되었다. ) 함수 에필로그는 함수의 끝을 의미하며, 이는 아래 코드로 구성되어 있다. leave ret leave의 내부 코드는 아래와 같다. mov esp, ebp pop ebp ret 내부 코드는 아래와 같다. pop eip jmp ei..