목록Computer App Penetesting (45)
외로운 Nova의 작업실
안녕하세요. 이번시간에는 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를 통해 알아냅..
- x86 함수 호출 규약 - x86-64 함수 호출 규약 - SYSV system ABI와 같다.
이번시간에는 shell_basic 문제를 풀어보도록 하겠습니다. - asm 짜고 OP code 만들기 먼저 파일 경로(/home/shell_basic/flag_name_is_loooooong)를 아스키코드로 변경해줍니다. 아래 링크로 들어가서 변경하면됩니다. https://www.rapidtables.org/ko/convert/number/ascii-to-hex.html ASCII에서 16 진수로 | 텍스트를 16 진 코드로 변환 ASCII 텍스트를 16 진수 코드로 변환 ASCII / 유니 코드 텍스트 문자열을 입력 하고 변환 버튼을 누릅니다. 텍스트를 16 진수로 변환하는 방법 텍스트를 16 진 ASCII 코드로 변환 : 캐릭터 얻기 ASCII 테이 www.rapidtables.org 2f 68 6f..
- 파일 열어서 읽고 출력하는 쉘코드 __asm__( ".global run_sh\n" "run_sh:\n" "push 0x67\n" "mov rax, 0x616c662f706d742f \n" "push rax\n" "mov rdi, rsp\n" "xor rsi, rsi\n" "xor rdx, rdx\n" "mov rax, 2\n" "syscall" "\n" "mov rdi, rax\n" "mov rsi, rsp\n" "sub rsi, 0x30\n" "mov rdx, 0x30\n" "mov rax, 0x0\n" "syscall" "\n" "mov rdi, 1\n" "mov rax, 0x1 \n" "syscall" "\n" "xor rdi, rdi\n" "mov rax, 0x3c\n" "syscall" )..
리버싱 입문에서 다루지 않은 crackme 시리즈를 리버싱 및 크랙해보려합니다. - 문제인식 password를 입력하라고합니다. 윗부분에 오직 숫자라고 합니다. 1234를 입력해보겠습니다. wrong으로 나옵니다. 아무래도 이번문제는 password를 알아내는 문제인 것 같습니다. - 리버싱 이 프로그램은 아마 우리가 입력한 패스워드를 cmp 한후 값에따라 jmp할 것입니다. 따라서 문자열 wrong을 찾고 jmp문 부분을 추적해서 패스워드를 비교하는 cmp문을 찾아보도록 하겠습니다. search for -referenced string을 통해 wrong을 찾았습니다. 한번 들어가보겠습니다. 실제가서 jmp문을 추적해보면 0040155c 주소에서 dmp문을 실행해서 wrong으로 가게됩니다.그위에 004..