분류 전체보기 (160) 썸네일형 리스트형 UAF (Use After Free) Heap영역은 동적으로 메모리가 할당되고 해제된다. 할당될 때는 malloc, calloc, realloc등이 사용된다. 해제할때는 free함수를 사용해서 할당한 부분을 해제해준다. UAF(Use After Free)는 메모리 영역을 할당하고 해제한 후에 재사용할 경우 발생하는 취약점이다. 코드를 보면 좀더 쉽게 이해가 가능하다. #include #include int main() { int* heap1; int* heap2; int* heap3; heap1 = (int*)malloc(sizeof(int) * 40); heap2 = (int*)malloc(sizeof(int) * 40); printf("heap1 address : %p\n", heap1); printf("heap2 address : %p.. Return to Libc (RTL) RTL이란 NX-bit(보안기법)이 걸려있을때 사용하는 공격 기법이다. NX-bit란 스택에서 코드 실행이 불가한 보안기법인데 쉘코드를 직접적으로 주입하거나 Ret에 overwrite해도 따로 실행되지 않아서 공격이 실패하게 된다. 윈도우에서 같은 보안기법으로는 DEP이 있다. RTL을 제대로 파헤치기 위해서는 함수호출 과정을 제대로 이해하는게 필요하다. #include int main(){ char buf[50]; read(0, buf, 100); return 0; } 다음과 같은 코드를 분석해보자 ======= RET ======= SFP ======= buf[50] 처음 스택이 이렇게 자라있을것이고 main함수에 에필로그를 진행하는 과정을 살펴보자 에필로그 과정은 다음과 같다. leave : mov.. GOT Overwrite GOT overwrite란 dynamic link방식으로 컴파일된 바이너리가 공유 라이브러리를 호출할때 사용되는 PLT&GOT 중 GOT 값을 변조하여 내가 의도한 함수를 호출 하도록 하는 기법이다. GOT와 PLT 개념에서 PLT는 GOT를 참조하고, GOT에는 실제 주소가 들어있다. 여기 GOT에 값을 원하는 함수의 실제 주소로 변조시키면, PLT는 변조한 함수가 호출된다. 이러한 기법이 GOT Overwrite이다. GOT overwrite 실습 간단한 실습 코드를 작성해 본다. 컴파일 해보면 (gcc -m32 -no-pie -fno-pic -o got got.c) 다음과 같이 gets로 받은 문자열을 그대로 출력해준다. 여기서 GOT Overwrite를 공격하기 위해서 어떻게 해야하는지 천천히 살.. PLT & GOT 파헤치기 PLT (Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다. GOT (Global Offset Table) : PLT가 참조하는 테이블. 프로시저들의 주소가 들어있음. 쉽게 말하면 C언어에서 자주사용하는 printf 함수를 호출할 때 printf가 처음 호출된다면 PLT 이동 > GOT로 점프 > GOT를 참조 > 다시 PLT이동 > _dl_runtime_resolve > 함수 호출 여기서 _dl_runtime_resolve 라는 함수는 필요한 함수의 주소를 알아오고, GOT에 그 주소를 써준 후 해당 함수를 호출한다. printf 함수의 호출이 처음이 아니라면 PLT 이동 > GOT로 점프 > GO.. [Algorithm] DFS 깊이 우선 탐색, BFS 너비 우선 탐색 (C++) DFS : Depth First Search (깊이 우선 탐색) 시작 노드부터 시작하여 다음 Branch로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법 모든 노드를 방문 하고자 하는 경우에 사용한다. 재귀함수를 이용하여 구현한다. 여기서 주의해야 할 점은 방문 여부를 반드시 검사해야 한다. 이러한 무방향 그래프를 1부터 시작해서 DFS로 탐색하겠다. #include #include using namespace std; bool visit[9]; vector node[9]; void dfs(int start_node) { visit[start_node] = true; cout [C++] Queue, Vector 사용법 정리 Queue Queue란? 컴퓨터의 기본적인 자료 구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식이다. C++ 헤더파일 #include를 추가해준다. Queue 기본함수에는 push, pop, front, back, empty, swap이 있다. #include #include using namespace std; int main() { // queue 변수명으로 큐를 선언한다. queue q; // push를 하여 queue의 데이터를 추가한다. q.push(1); q.push(2); q.push(3); q.push(4); q.push(5); queue second_q; second_q.push(6); second_q.push(7);.. [SUA] 오픈소스 보안 10,11주차 보호되어 있는 글입니다. [SUA] 오픈소스 보안 9주차 보호되어 있는 글입니다. 이전 1 2 3 4 5 6 ··· 20 다음