본문 바로가기

분류 전체보기

(133)
[C언어] 현재 작업 디렉터리 위치 알려주는 함수 (getcwd) C 언어에서 현재 디렉터리를 알려주는 함수인 getcwd에 대해 알아봅시다. getcwd는 get current working directory의 줄임말로 현재 작업하고 있는 디렉토리의 위치를 알려줍니다. Format #include char * getcwd (char *buffer, size_t size) 함수는 이와 같이 구성되어있으며, 아래와 같이 2가지 방법으로 사용할 수 있습니다. 1. char 타입의 buffer 배열을 선언하는 경우 2. getcwd() 함수 내부에서 동적할당하여 작업 디렉터리를 반환하는 경우 2번의 경우에는 free를 통해 자원을 반환해주어야 합니다. 예제를 통해 간단하게 getcwd()에 대해 알아보았습니다. [1] 참고 자료 https://www.gnu.org/softw..
메모리 보호 기법 Checksec.sh 실행 파일에서 제공하는 보안 매커니즘을 알기 쉬운 형태로 표시해주는 쉘 스크립트로 메모리 보호 기법인 PIE, RELRO, Canaries, ASLR, NX bit 등을 확인하는 데 사용되는 툴 https://github.com/slimm609/checksec.sh GitHub - slimm609/checksec.sh: Checksec.sh Checksec.sh. Contribute to slimm609/checksec.sh development by creating an account on GitHub. github.com Checksec.sh은 실행 파일에 어떤 메모리 보호 기법이 적용되어 있는지 확인할 수 있는 기능을 제공하는 툴입니다. 이 페이지는 RELRO, SSP, NX ..
CTF Tools checksec.sh 실행 파일에서 제공하는 보안 매커니즘을 알기 쉬운 형태로 표시해주는 쉘 스크립트로 메모리 보호 기법인 PIE, RELRO, Canaries, ASLR, NX bit 등을 확인하는 데 사용되는 툴 https://github.com/slimm609/checksec.sh GitHub - slimm609/checksec.sh: Checksec.sh Checksec.sh. Contribute to slimm609/checksec.sh development by creating an account on GitHub. github.com peda peda는 gdb 디버깅 툴의 기능을 대폭 강화해주는 확장 스크립트로서 디버그 정보 표시 강화, 간이 ROP Gadget 검색, 메모리 검색 강화 등 ..
[C언어] mysql 라이브러리 (libmysql) C API libmysql libmysql은 C언어에서 MySQL을 사용할 수 있도록 제공하는 C API 입니다. libmysql을 사용하기 위해서는 가장 우선적으로 mysql_init(), mysql_real_connect()통해 데이터베이스에 연결해줍니다. 이후, MySQL API들을 사용한 후, mysql_close()를 통해 종료시켜줍니다. Connection API MYSQL * mysql_init(MYSQL *mysql) MYSQL * mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socke..
Use after free Use after free 란? Use after free 는 동적 할당(Dynamic allocation)을 통해 Heap에 메모리를 할당하여 사용하고 Free를 통해 메모리 해제를 한 후, 다시 같은 크기의 메모리 크기만큼 동적 할당(Dynamic allocation) 할 경우 이전에 사용했던 메모리를 할당해주게 되어 발생하는 취약점입니다. 아래 예제를 통해 알아보도록 합시다. UAF (Use After Free) 예제 위 예제를 보면, buf 에 128 bytes 만큼의 공간을 힙에 할당해주고 난 후, "A" 10개를 String Copy 하고 Free 해주었습니다. 이후, buf2가 다시 같은 크기 128 bytes 만큼의 공간을 할당한 후, 바로 buf2를 출력합니다. 그런데, 아무것도 입력해주..
GOT Overwrite GOT Overwrite 란? GOT Overwrite는 컴파일 과정 중 Link 부분에서 Static Linking 방식이 아닌 Dynamic Linking 방식으로 컴파일된 바이너리가 공유 라이브러리(Shared Library)에 존재하는 함수를 호출할 때 PLT와 GOT 과정을 거치는데 GOT에 원래 함수가 아닌 변조된 함수를 호출하도록 하여 공격하는 방식입니다. PLT와 GOT에 대해 간단하게 설명을 드리자면, printf 함수와 같이 공유 라이브러리에(Shared Library)에 존재하는 함수를 사용하기 위해서는 printf 함수의 PLT를 호출한 후, GOT로 점프하여 함수의 실제 주소가 쓰여 있는 곳으로 이동하는 과정을 거칩니다. 이때, 첫 호출이라면 GOT는 실제 함수의 주소를 가지고 있..
NOP Sled NOP Sled (RET Sled) 란? NOP Sled 방식은 Buffer overflow 공격에 자주 사용되는 방식으로 NOP라고 불리는 어셈블리 명령을 사용하여 공격에 대한 오차 범위를 줄이기 위한 의도로 사용되는 방법이다. NOP를 만나면 아무것도 하지 않고 다음 명령으로 넘어가는 것이 연속적으로 일어날 때 마치 썰매를 타는 것과 같다 하여 Sled (썰매)라는 말이 붙어 NOP Sled라고 부르게 되었다고 한다. NOP (No operation) 란? NOP란 No operation의 줄임말로 어셈블리 명령이다. 이 명령은 1 바이트로 되어 있으며 실제로 아무 것도 하지 않는다. 이 명령은 컴퓨터 내부에서 타이밍을 맞추기 위해 내부 사이클을 소모하는데 쓰인다. 또는 스팍(Sparc) 프로세서에서..
스택 프레임(Stack Frame)이란? 스택 프레임(Stack Frame)이란 스택 영역에 함수를 구분하기 위해 생성되는 공간으로서 Parameters, Return Address, Local variables를 포함하고 있으며, 함수 호출 시 생성되고 함수가 종료되면서 소멸됩니다. 프로그램은 함수 호출 시 스택 프레임을 생성하기 위해 함수의 프롤로그(Prolog) 과정을 거치고, 스택 프레임을 소멸시키기 위해 함수의 에필로그(Epilog) 과정을 거치게 됩니다. 그럼, 함수의 프롤로그와 에필로그는 어떠한 과정을 수행하는지 알아봅시다. 예를 들어, 아래와 같은 코드가 있다고 가정해봅시다. #include void sum(int a, int b) { printf("sum : %d\n", a+b); } int main() { int num1, n..