[▒] 언어
#1 표준 스트림 표준 스트림이란 프로그래밍 언어와 운영체제에서 특정 프로그램이나 단말기 사이에 미리 연결된 입출력 통로이다. 예전에는 하드웨어와 OS 사이에 복잡하게 연결되어있었지만, 현재는 추상화하여 함수 형태로 사용할 수 있다고 합니다. 표준 스트림으로 입력, 출력, 에러 스트림이 있습니다. 이는 유닉스에서 프로그램을 사용할 때 자동으로 연결해준다고 합니다. 더보기 C의 표준 스트림 : stdin, stdout, stderr C++의 표준 스트림 : std::cin, std::cout, std::cout, std::cerr, std::wcin, std::wcout, std::wcerr, std::wclog #2 입출력 버퍼 동기화 일반적으로 입력과 출력은 동기화되어있어 한 쪽에서 작업 요청 시 fl..
환경 UBUNTU 16.04.07 VMware Workstation 15 Player 개요 Shell Reverse TCP Shellcode란 Remote BOF 기법에서 쓰이는 쉘코드로, Reverse connection 방식을 이용한다. 다른 방식에는 Bind가 있으며 추후에 다룰 예정이다. Reverse connection은 공격자가 미리 서버를 Binding하고 있는 상태에서 피해자가 공격자의 서버에 접속하는 방식이다. 다시 말해, Shell Reverse TCP Shellcode는 피해자가 공격자의 서버에 접속해 공격자가 쉘을 떨어뜨리는 Shellcode이다. Shellcode 제작 소켓을 만든 뒤, 로컬에서 55555포트에 연결하고 STDIN(0), STDOUT(1), STDERR(2)를 소켓..
shmget int shmget(key_t key, int size, int shmflg) key : 시스템에서 식별하는 공유 메모리 번호 size : 공유메모리 크기 shmflg : 동작 옵션 공유메모리를 생성하는 함수이다. 반환값으로는 공유메모리 식별자를 내뱉는다. 만약 실패시 -1을 내뱉는다. 헤더파일로는 sys/ipc.h, sys/shm.h를 include 해야한다. shmflg IPC_CREAT : key에 해당하는 공유메모리가 존재 X시, 생성과 동시에 접근 권한도 부여한다. 만약 공유메모리가 있다면 이 옵션은 무시해도 좋다. IPC_EXCL : 공유메모리가 있으면 실패로 -1을 반환한다. 이 값이 설정되지 않으면 기존 공유 메모리에 접근해 식별자를 반환한다. shmat void *shmat(..
Stack Oveflow를 공부할 때 사용하는 gcc 옵션을 정리해보겠다. -m32 32비트 모드로 컴파일하는 옵션이다. 64비트로 하고싶다면 -m64를 주면 된다. -no-pie PIE를 끄는 옵션이다. PIE를 통해 컴파일을 하게 되면 실제 주소에 상대 주소가 매핑되어 실행할 때마다 주소 값이 바뀌며 단순하다는 특징을 가지고 있다. -z norelro RELRO는 Relocation Read-Only의 약자로 바이너리의 symbol 및 got 등에 보호기법을 거는 것을 말한다. NO RELRO는 ELF 기본헤더, 코드영역을 제외한 거의 모든 부분에 Read, Write 권한을 준다. Partial RELRO는 NO RELRO에서 _DYNAMIC 섹션에 Write 권한이 없다. FULL RELRO는 b..
gcc 전역 옵션 -E 전처리 과정 화면에 출력 -S 어셈블리 파일 생성 -c 오브젝트 파일 생성 -v 컴파일 과정 화면에 출력 --save-temps 컴파일시 생성되는 중간 파일 저장 -da 컴파일 과정에서 생성되는 중간 코드 생성(RTL파일 등 생성) 전처리기(cpp0)옵션 -l[패스] 헤더 파일을 탐색할 디렉터리 지정 ex) -l/opt/include -include [헤더 파일 패스] 해당 헤더 파일을 모든 소스 내 추가 ex) -include /root/my_header.h -D[매크로] 외부에서 #define 지정 -DDEBUG -D[매크로]=[매크로 값] 외부에서 해당 매크로를 정의하고 값을 지정 ex) -DDEBUG=1 -U[매크로] 외부에서 #undef 지정 ex) -UDEBUG -M 또..
gcc -v를 통해 버전을 확인하자. 설치되어있지 않다고 한다면, sudo apt install gcc 명령을 통해 설치하자. gcc 사용하기 먼저, C언어를 배웠다면 정말 지긋지긋하기 짝이 없는 이 소스코드를 hello.c라는 이름으로 저장한다. 무소식이 희소식이다.. hello.c 파일을 실행시키려고 무심코 'hello'를 쳤다. 당연히 안된다. 어떠한 파일을 실행시키고 싶을 때에는 꼭 ./으로 적어줘야한다. 유닉스는 기본적으로 PATH라는 환경변수에 있는 디렉터리에서만 실행파일을 찾는다. 만약 PATH라는 도트 문자(.)이 들어있지 않으면 현재 디렉터리의 실행파일은 절대 실행되지 않는다. 게다가 현재 디렉터리를 PATH 환경 변수에 넣어준다 할지라도 현재 디렉터리를 먼저 찾는다든지 하는 일은 없다...
실행중인 프로그램의 메모리 구조이다. CODE 영역 실행하는 프로그램 코드가 있는 영역 DATA 영역 전역변수(global), 정적변수(static)등이 저장되는 영역이며, 초기화되지 않은 변수는 BSS에 저장된다. 함수 내부에 선언된 static 변수는 프로그램이 실행될 때 공간만 할당되고, 그 함수가 실행될 때 초기화 된다. HEAP 영역 런타임시 동적으로 할당된 변수 값이 있는 영역 공유 라이브러리 영역 프로그램에 사용되는 라이브러리와 관련된 공유 라이브러리 파일이 적재된 영역 STACK 영역 함수의 지역변수, 매개변수가 위치하는 영역 PUSH, POP을 통해 스택의 데이터를 핸들링 할 수 있음 HEAP(힙) 요청한만큼 동적으로 메모리 할당 낮은 주소에서 높은 주소로 증가 런타임 시 크기 결정 ST..