목록Computer App Penetesting/System Vulnerability (26)
외로운 Nova의 작업실
이번 포스팅은 c언어와 어셈블리사이의 관계에대해서 정리하겠습니다. 특히, if문 for문 case문이 어떻게 어셈블리어로 변환되는지 보겠습니다. 실습환경은 윈도우 10 64비트입니다. - if문 #include int main() { int a = 1; int b = 0; if (a == 1) { a++; } else { b++; } return 0; } #include int main() { 00007FF628941750 push rbp 00007FF628941752 push rdi 00007FF628941753 sub rsp,128h 00007FF62894175A lea rbp,[rsp+20h] 00007FF62894175F lea rcx,[__F4170C15_test@cpp (07FF62895100..
안녕하세요. 이번시간에는 드림핵 Return to Shellcode 문제풀이를 해보도록 하겠습니다. - 문제인식 강의해서 실습하는 거라 별다른 문제정보는 없습니다. 특히나 지금 wsl로는 실행파일을 다운로드 하지 못해서 checksec을 하기 어려운 부분이 있으므로 강의를 참고하겠습니다. 환경을 보게되면 amd64 아키텍쳐 즉 x8-64 명령어 셋을 사용하고 있습니다. Full RELRO로 BSS를 제외한 곳에 write이 안되지만 스택을 건드릴 것이므로 괜찮습니다. 카나리를 사용중이고 NX가 사용중이지 않아서 스택에 쉘코드를 넣고 실행해야할 것 같습니다. PIE가 실행중이여서 실행마다 buf의 주소는 변할 것 같습니다. 이제 코드를 보겠습니다. // Name: r2s.c // Compile: gcc -..
- 카나리 스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법입니다. 카나리 값의 변조가 확인되면 프로세스는 강제로 종료됩니다. 카나리값의 첫번째 값은 leak을 방지하기위해 보통 null값입니다. - 카나리 할당 과정 1. 프로세스는 프로그램을 실행하고 카나리를 fs 세그먼트의 주소값을 설정합니다. 이때 fs 주소값이 설정되면 시스템은 arch_prctl()함수를 호출합니다. 2. 이후 fs 세그먼트 공간이 확보되면 프로그램이 작동하면서 fs세그먼트 시작부분으로부터 0x28번째 공간에 임의의 값으로 넣습니다. 3. 이후 카나리를 사용해야하는 프로그램은 이 카나리값을 사용합니다. - 카나리가 적용된 프로그램과 미..
안녕하세요. 이번시간에는 basic_exploitation_001을 풀어보도록 하겠습니다. - 문제인식 이번에는 NX 보호기법이 걸려있어서 스택에 쉘코드를 집어넣고 실행하지 못하는 걸 알 수 있습니다. 운영체제는 우분투 16.04를 쓰고 아키텍처는 i386 아키텍처를 쓰는 것을 알 수 있습니다. 이 환경에서 리버싱을 해서 프로그램의 구조를 알아야되지만 저는 윈도우를 쓰고 있기때문에 불가능합니다. 그에따라 리버싱관련해서 알아내는 것은 다른 페이지를 참조할까합니다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF,..
파이썬 interactive() 함수는 신기합니다. 저의 쉘과 상대방의 쉘이 연결된 것 처럼 보입니다. 이를 어떻게 구현하는지 한번 알아보겠습니다. - interactive()함수가 신기한 이유 먼저 우리는 소켓 프로그래밍을 할때 서로간의 통신은 문자열로 통신을 합니다. recv() 함수와 send()함수로 말입니다. 하지만 상대방의 쉘에 send()함수로 명령을 내려도 쉘에서 나온 문자열이 send() 되지 않으니 상대방 쉘이 출력한 값을 알 수 없습니다. 하지만 interactive()함수는 그것을 가능하게합니다. - creatprocessA() 함수 c언어에서 CreateProcessA() 함수가 있습니다. 이 함수를 아래와 같이 씁니다. CreateProcessA(NULL, "cmd.exe", N..
이번시간에는 드림핵 basic_exploitation_000 문제를 풀어보도록 하겠습니다. 저의 환경은 윈도우지만 wsl을 사용하는중입니다. - 문제인식 서버의 취약점을 찾고 익스플로잇한 후 셸을 획득하는 문제입니다. 아래는 서버의 환경으로 하나씩 보게습니다. Ubuntu 16.04 : 운영체제 입니다. Arch: i386-32-little : CPU 아키텍처로 어셈블리어를 작성할때 필요합니다. RELRO: No RELRO : relocation read only의 약어로 BSS빼고 모두 write이 안되게 보호하는 기능입니다. 하지만 no RELRO이기때문에 기능이 꺼져있는 것을 알 수 있습니다. 즉, code 영역도 write 할 수 있다는 얘기입니다. Stack: No canary found : s..
wsl에서는 원래 32비트 프로그램이 실행되지 않습니다. 따라서 32비트 프로그램을 실행하려면 binfmt가 있어야합니다. 아래 순서대로 start 까지 한 후 프로그램을 실행하면 됩니다. 하지만, 실행만 가능할뿐 리버싱을 하게되면 64비트처럼 되므로 리버싱의 경우에는 wsl이 아닌 가상머신을 사용해야합니다. - binfmt 설치 sudo apt install qemu-user-static sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xf..
stack buffer overflow 실습을 해볼까합니다. - 취약점이 있는 코드 #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell(){ char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main(){ char buf[0x28]; init(); printf("input: "); scanf("%s", buf)); return 0; } scanf 함수는 사용자로부터 받은 값을 검증하지 않고 버퍼에 넣기때문에 버퍼보다 사용자로부터 받은 값이 크다면 버퍼를 흘러 넘치게됩니다. buf의 크..
- shell code 작성 취약점 : 컴퓨터는 op code로 작동하기때문에 여러 명령들을 op code로 변환하여 컴퓨터에게 명령을 내리면 컴퓨터는 그 명령대로 수행합니다. 목표 : 공격 목표에 맞는 shell_code를 작성합니다. 방법 : 1. 공격 목표를 수행하는 asm파일을 만들고 obj 파일로 만듭니다. 2. obj 파일을 이진파일로 만들어 읽어 shell_code를 작성합니다. - stack buffer overflow 취약점 : strcpy(), scanf() 함수와 같이 버퍼의 크기를 고려하지않고 사용자의 입력값을 모두 사용합니다. 목표 : 버퍼의 크기를 넘어 stack 의 ret 주소에 원하는 주소를 넣어 실행 흐름을 변경합니다. 방법 : 1. 실제 버퍼의 크기를 gdb를 통해 알아냅..