Try Attack/System Hacking[basic]13

Windows에서 Shellcode 작성하기 오늘은 shellcode작성하기로 포문을 열겠습니다. 갑자기 shellcode? 이럴 수 있지만.. symbolic execution을 하는 과정에서 비트벡터 내 shellcode를 삽입하고 메모리에 올리기 위한 기초공사로 shellcode를 만들고 있지요. 그럼 시작해 볼까요? shellcode 넌 누구니?! 위키백과가 왈 "컴퓨터 보안에서 셸코드란 작은 크기의 코드로 소프트웨어 취약점 이용을 위한 내용부에 사용된다." "셸코드로 불리는 까닭은 일반적으로 명령 셸을 시작시켜 그곳으로부터 공격자가 영향 받은 컴퓨터를 제어하기 때문이다." 요약해보면 "취약점을 이용해 내부에 삽입하는 코드" 정도로 보이네요. shellcode는 악성동작을 하는 코드인 페이로드(payload)이고, 실제로 공격을 하려면 sh.. 2019. 7. 27.
입력방법에 따른 python 공격코드 작성법 1. 입력▶ 공격자는 입력 시에 올바르지 않은 값을 입력해서 프로그램이 비정상적으로 동작하도록 공격한다. (1) 그렇다면 프로그램에서 입력은 어떻게 받을까?▶ 크게 보면 stdin과 argv 2가지로 나누어진다. [1] stdin ▶ standard input은 표준입력을 말한다. ▶ 프로그램이 동작하면서 필요한 내용을 입력을 받는다. [2] argv ▶ argv는 프로그램 시작 시에 파라미터로 넣는 것을 말한다. 2. 공격코드 작성(1) 그렇다면 공격코드는 어떻게 넣어서 동작하도록 할까? ▶ 표준입력을 할 때와 파라미터로 넣을 때 두가지로 나뉜다. ▶ 위에서 왜 입력방법을 두가지로 나누었는지 알 수 있을 것이다. (2) 표준 입력 시 공격코드 작성 [1] 먼저 프로그램이 실행되어야 하고 프로그램이 돌아.. 2019. 1. 19.
RTL(Return To Libc) 파라미터 1. RTL(Return To Libc) ▶ RTL 공격은 리눅스의 메모리보호기법 중 하나인 NX bit를 우회하기위해 사용하는 공격기법이다. ▶ 이 공격은 버퍼오버플로우를 통해 호출한 서브루틴의 리턴주소를 메모리에 위치한 함수의 주소로 변경한다. (1) NX bit(Never eXecute bit)란? ▶ Windows 운영체제의 DEP(Data Execution Prevention)와 비슷하다. ▶ 즉, 메모리 내에 데이터 실행을 예방? 방지?한다. ※ 간단한 예로 공격자가 BOF를 일으켜서 shellcode를 작성하고 return address를 shellcode의 시작주소로 변경하였다. NXbit 보호기법이 적용되지 않았다면 shellcode가 실행되지만 NXbit가 적용되었다면 스택 내에서 실행.. 2019. 1. 11.
RTL(Return To Libc) 입력 3. 시연 2019. 1. 11.
Overflow - 2 BOF.c 소스파일 #include #include #include void goal() { puts("\n==================================="); puts(" you got the shell! \n==================================="); setreuid(0,0); system("/bin/sh"); } void bp1() { char buf1[20]; fgets(buf1, 40, stdin); } void bp2() { char buf2[30]; fgets(buf2, 60, stdin); } void bp3() { char buf3[40]; fgets(buf3, 80, stdin); } int main() { int choice; printf("1.. 2018. 5. 24.
Overflow - 1 vulnerable.c 위 코드는 strcpy()함수로 argv[1]을 str로 복사 후 printf()함수로 str을 출력 그러나 위 코드에는 strcpy()함수와 printf()함수의 취약점이 존재. strcpy()는 argv[1]의 문자열의 길이를 검증하지 않아 Buffer Overflow 취약점이 발생 printf()는 포멧 타입과 인자를 지정하지 않고 변수를 직접 인자로 넣어서 Format String Bug 취약점이 발생 시나리오1. Buffer Overflow - str 사이즈가 256byte이고 strcpy()는 문자열의 길이를 검증하지 않으므로 argv[1]에 shell 코드를 넣고 str로 복사하여 str을 Overflow시키고 main()함수의 return address를 str주소로.. 2018. 5. 20.
gcc 메모리보호옵션 gcc메모리 보호옵션 -m32 32bit로 컴파일 -fstack-protector(-all) ssp 보호기법 켜기 -fno-stack-protector ssp 보호기법 끄기 -W,-Wall 모호한 코딩에 경고를 보냄 -S 어셈블리 파일 생성 -std=[c표준] 지정한 c표준으로 컴파일 -l[라이브러리] 해당 라이브러리를 링크 -shared 공유 라이브러리를 우선 링크 -static 정적 라이브러리를 우선 링크 -s 심볼 테이블 제거 -Wl,-z,relro,-z,now Full Relro 보호기법 적용 -e [name] 시작 심볼을 name심볼로 사용 -M 심볼들의 정보르 자세히 출력 -fno-builtin 단독으로 링크(표준lib 링크 X) -mpreferred-stack-boundary=2 더미 없애기.. 2018. 5. 18.
gcc 사용방법 보호되어 있는 글 입니다. 2018. 5. 18.
함수의 호출규약 1. 함수 호출 규약(Calling Convention) ▶ 파라미터를 전달하는 방법에 대한 약속을 정의한 것이다. 2. 32비트 모드 (1) __cdecl 방식(C declaration) [1] C와 C++(가변인자)의 기본 호출규약이다. [2] 인자(argument)는 스택을 사용해서 오른쪽에서 왼쪽 순서로 전달한다. [3] callee(호출자)가 스택포인터를 정리한다. (c언어에서는 내부적으로, assembly에서는 직접) [4] 함수이름 앞에 _(언더바) 기호가 붙는다. (2) __stdcall 방식(Standard Call) [1] Win32 API[Windows OS의 System call]의 기본 호출 규약이다. [2] __cdecl방식과 동일하게 인자(argument)는 스택을 사용해서 오.. 2018. 5. 18.
gdb debugging (gdb) break *main+0 Breakpoint 1 at 0x804840b - main의 기준주소 + 1번째 주소를 breakpoint로 지정 (gdb) break *0x0804840c Breakpoint 2 at 0x804840c - 위와 같은 뜻이지만 main의 주소에 1을 직접더해서 사용 (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x0804840b 2 breakpoint keep y 0x0804840c - breakpoint 되어있는 목록 확인 (gdb) del 2 (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x0804840b - de.. 2018. 5. 17.
gdbgui install $ sudo apt-get install git [설치형태] git clone git://"github주소".git ex)$ git clone git://github.com/cs01/gdbgui.git $ sudo apt install python-pip $ pip install gdbgui --upgrade $ gdbgui 2018. 5. 17.
gdb disassemble - c 원본소스 - - 실행파일 exe를 gdb로 main 함수를 disassemble 한 것 - 1) push ebp => 이전 함수의 기준주소를 stack에 저장 - ebp란? extended base pointer로 기준주소를 의미한다. 2) mov ebp, esp => 현재 stack의 top pointer를 기준주소로 저장 (main함수의 기준주소를 ebp에 저장) - 모든 함수의 시작에는 1) 과 2)가 있다. 3) sub esp, 0x8 => stack memory의 공간을 8byte만큼 확보한다. 4) mov DWORD PTR [ebp-0x4], 0xa => 0xa(10진수 10)를 ebp-0x4 [3)에서 확보한 스택포인터]에 4byte정수를 넣는다. - DWORD PTR은 4byte 정.. 2018. 5. 16.