Security/System Security
-
[System Security] 기말고사 정리Security/System Security 2021. 6. 7. 23:34
ASLR 해제 명령 더보기 sudo sysctl kernel.randomize_va_space=0 (default=2) gcc 디버깅 정보 추가 옵션 더보기 gcc -o stackbof stackbof.c -fno-stack-protector -mpreferred-stack-boundary=2 -g stackexploit1 더보기 1. ./stackexploit1 512 2. Heap에 512만큼 (NOP sled + shell code) 작성 3. stack에 (12*A + 추측한 주소) 작성 4. execl("./stackbof1, stackbof1, 스택버퍼, 힙버퍼, NULL) 1. 스택버퍼로 받은 인자를 스택에 저장 2. 출력 3. main return시 조작된 주소로 return heapexp..
-
[System Security] 실습 정리Security/System Security 2021. 5. 11. 15:55
실습 1. PTR 유형 (mov dword ptr) - mov 명령으로 상수를 저장하면 default로 byte ptr가 적용된다 - 정상적으로 명령어를 수행하려면 dword ptr를 붙이자 # include int main(){ int i=0; __asm{ mov ss:[esp], 0x12345678 // mov eax, [esp] mov eax, dword ptr [esp] mov i,eax } printf("%x\n", i); } 실습 2. Direct Addressing - 대괄호 안에 상수가 들어가면 대괄호는 무시된다 # include int main(){ int i=0; __asm{ // mov eax, [0012FE90h] mov eax, SS:[0012FE90h] mov i,eax } pr..
-
[System Security] 명령어 정리Security/System Security 2021. 5. 11. 15:19
리눅스에서 Intel 문법으로 변환 (gdb) set disassembly-flavor intel Section Header 정보를 본다 readelf -S sum-s hello 파일의 dynamic dependancies를 list한다 ldd hello write 함수에 breakpoint 걸기 (gdb) b write BP 나올때까지 run (gdb) r 현재 명령어의 호출을 backtrace (gdb) bt 해당 함수의 disassemble 코드를 출력 (gdb) disass main// main함수 disassemble (gdb) disass *0x00110416// 해당 위치 disassemble (gdb) disass *write+28// write 함수에서 28바이트 위치 disassembl..
-
[System Security] 7.3 쉘 코드 작성Security/System Security 2021. 5. 11. 14:30
1. "/bin/sh" 문자열을 임의의 메모리에 위치시킴 .string "/bin/sh" 2. NULL문자(0)를 "bin/sh"뒤에 붙인다. ("/bin/sh\0") movb $0x0, [0x0 1바이트에 대한 주소] 3. /bin/sh 문자열 주소값을 불러와서 name[0]에 할당한다 movl [/bin/sh 문자열이 저장된 주소], [name[0]의 주소] 4. null값을 name[1]에 해당하는 주소에 할당한다 movl $0x0, [name[1]에 대한 주소] 5. 0xb를 EAX 레지스터에 저장한다 movl $0xb, %eax 6. /bin/sh 문자열의 주소를 EBX 레지스터에 저장한다 movl [/bin/sh 문자열의 주소], %ebx 7. /bin/sh 문자열 주소를 저장한 곳의 주소를 ..
-
[System Security] 7.2 쉘 코드 획득Security/System Security 2021. 5. 10. 20:35
0. gcc -o shell shell.c -fno-stack-protector -mpreferred-stack-boundary=2 -static - fno-stack-protector : Canary 해제 - mpreferred-stack-boundary=2 : main함수에 스택을 정렬하는 인스트럭션 제거 - static : static 컴파일 할거야 1. gdb shell -q - shell 파일 조용하게 디버그 시작 2. disass main - movl 상수값 발견 3. x/2s 0x80ae428 - 해당 주소에서 string 두개를 보여줘 4. si - execve함수로 si 5. x/x $esp - esp 레지스터 hex한개 보여줘 6. disass execve
-
[System Security] 7.1 시스템콜 원리Security/System Security 2021. 5. 10. 19:55
write(1, "Hello", 5); 동작 원리 1. stack에 차례대로 5, "Hello", 1 저장 2. 파라미터를 레지스터에(stack -> register) 저장 5, "Hello", 1, 4(write의 systemcall번호) 3. INT 0x80 / SYSENTER : 레지스터의 값들을 스택의 커널 메모리로 이동 4. sys_call_table의 4번 함수 sys_write를 호출 vsyscall 실습 1. ldd hello - hello 파일의 dynamic library를 list해봐 - ld.so(다이나믹 링커), libc.so(add함수) 제외하고 하나 더 발견 (linux-gate.so) 2. gdb hello - hello 파일 debug 3. b write - write 함수..
-
[System Security] 6.5 Lena's Crackme : OllydbgSecurity/System Security 2021. 5. 10. 18:54
1. Registration Code 찾기 - 아무 값이나 입력하면 "Sorry ! Wrong registration code !" 경고창이 뜬다 - Ollydbg에서 해당 문자열을 찾아 spacebar/더블클릭하여 step into한다 - 스크롤을 올려 __vbaStrCmp 함수 호출 코드를 확인한다 - 전달 인자로 "I'mlena151" 문자열을 확인할 수 있다 2. 메시지 박스 제거 - Search for - All intermodular calls 에서 rtcMsgBox 탐색 - BP for all calls to rtcMsgBox() 선택하여 모든 호출에 BP를 건다 (총 4개) - 4개의 BP 중 하나에만 Break 걸림 (위치 탐색 완료) - Win32 API의 경우 stdcall 규칙에 따..
-
[System Security] 6.4 문자열 패치Security/System Security 2021. 5. 10. 17:45
1. 문자열 버퍼를 직접 수정하기 - 찾은 문자열 버퍼에서 문자열을 마우스로 선택 - 우클릭 - Edit - Binary Edit - 유니코드 문자열은 2바이트 크기의 NULL로 끝나야 한다 - 실행하여 확인 - 우클릭 - Edit - Copy to all modifications to executable 선택 - Hex 창이 뜨면 Save file 메뉴를 선택하고 파일(HelloWorld2.exe)을 저장 2. 다른 메모리 영역에 새로운 문자열을 생성 - 찾은 문자열 버퍼에서 스크롤을 내려 null padding 영역을 찾기(최대한 가까운 곳으로 이동) - 적당한 위치에 (Ctrl+E)를 통해 문자열을 입력 (Hello Reversing World) - Code 창에서 기존 문자열 PUSH 하는 코드를..