일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- CSS
- BOJ
- 머신러닝
- 풀이
- c
- The Loard of BOF
- Sookmyung Information Security Study
- C언어
- 파이썬
- 숙명여자대학교 정보보안 동아리
- 숙명여자대학교 정보보안동아리
- 웹페이지 만들기
- 백준
- c++
- 생활코딩
- XSS Game
- SWEA
- 기계학습
- 드림핵
- Python
- lob
- 자료구조 복습
- BOJ Python
- hackerrank
- Javascript
- PHP 웹페이지 만들기
- HTML
- WarGame
- siss
- hackctf
- Today
- Total
목록전체 글 (346)
혜랑's STORY
먼저 주어진 파일을 다운받아 코드의 흐름을 살펴보자. basic_heap_overflow.c #include #include #include #include #include struct over { void (*table)(); }; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } void table_func() { printf("overwrite_me!"..
7주차 자유문제 풀이 계곡이 몇 개인지 세는 문제로 U와 D로 입력을 받고 원래 높이보다 낮았다가 다시 올라오면 계곡 하나로 카운트하게 된다. flag 변수를 만들어 U일때 1, D일때 -1이 되도록 코드를 작성하였고, 계곡의 조건인 -1에서 0이 될 때(-1 + 1 = 0) 카운트를 1 증가시킨다. 이렇게 계곡의 수를 모두 세어준 뒤 그 값을 반환한다. int countingValleys(int steps, string path) { int flag = 0, answer = 0; for(int i=0; i
7주차 자료구조 복습 풀이 먼저 트리의 루트가 있는지 확인해 준다. 이때 루트가 존재하지 않는다면, 루트에 동적할당을 한 뒤, 데이터를 넣고 left와 right은 각각 NULL로 초기화 한다. 루트가 있는 경우엔 데이터 값의 크기에 따라 구분해야 한다. 삽입할 값이 루트의 데이터보다 작다면 left에 넣어야 하므로 insert 함수에 root->left를 불러 데이터를 넣어준다. 반대의 경우 right을 불러 데이터를 넣어주면 된다. 마지막엔 root를 반환한다. Node * insert(Node * root, int data) { if(root == NULL){ root->data = data; root->left=NULL; root->right = NULL; } else if(data < root-..
6주차 자료구조 복습 문제 Prepare > Algorithms > Sorting 풀이 삽입정렬을 사용하여 배열의 원소를 정렬할 때, 자리가 변경되는 횟수를 반환하는 문제이다. 먼저 원래 알고있던 삽입정렬 알고리즘을 활용하여 코드를 작성하였다. 그 뒤, 자리가 변경되는 곳에서 cnt의 횟수를 증가시키고 배열이 완전히 정렬된 후 cnt값을 반환하였다. int runningTime(vector arr) { int cnt, data, i, j; for(i=1; i=0&&arr[j]>data; j--){ ++cnt; cout
6주차 자유 문제 Prepare > Algorithms > Strings 풀이 문제에서 요구하는 것은 주어진 조건을 만족하기 위해 추가해야 할 최소한의 문자이다. 문제에 주어진 조건을 checkList로 만들어 두고, 이 조건을 만족하는지 확인하기 위해 check 배열을 만들어 주었다. 코드는 간단히 살펴볼 수 있다. 각 조건에 만족하는 값이 password에 있다면 check에 true를 넣고 다음 조건을 검사하는 방식이다. 최종적으로 !check[i]를 만족하는 즉, 문자를 추가해야 하는 수를 센다. 이때 바로 이 값을 넘기는 것이 아니라 password 최소 길이인 6을 만족하는지 검사하게 된다. 만약, 길이를 만족하지 못하고 부족한 길이 만큼이 미리 계산해둔 cnt보다 크다면 cnt는 부족한 길이..
우분투 버전이 16.04라 tcache를 실행할 수 없어 드림핵에 있는 자료를 가져와서 사용함!! Heap Feng Shui 힙의 레이아웃을 조작하여 원하는 객체를 덮어쓸 수 있게 하는 기법 리얼 월드에서는 프로그램의 코드가 큰만큼 동적 할당도 많이 이루어지기 때문에 힙 오버플로우 취약점이 있다하더라도 힙 원하는 객체를 덮어쓰는 것이 쉽지 않다. 덮어쓸 객체의 낮은 주소에 힙 오버플로우가 발생하는 힙을 할당하여 덮어써야 한다. C++의 경우 특정 클래스가 불리면 생성자가 호출되고, vtable이 힙과 같은 특정 메모리에 할당이 될 것이다. 이때 힙 오버플로우 취약점을 이용하여 vtable 객체를 덮기 위해서는 해당 객체보다 낮은 주소에 힙을 할당하여야 한다. // gcc -o fengshui1 fengs..
5주차 자료구조 복습 문제 Prepare > Algorithms > Sorting 풀이 Counting Sort의 응용 문제이다. Counting Sort의 알고리즘은 다음과 같다. 1. 0~n 까지의 버켓을 준비한다. 2. 모든 데이터에 대하여 가장 낮은 자리수에 해당하는 버켓에 차례대로 데이터를 저장한다. 3. 0부터 차례대로 버켓에서 데이터를 다시 가져온다. 4. 가장 높은 자리수를 기준으로 하여 자리수를 높여가며 과정을 반복한다. 해당 문제는 2번까지 한 뒤 원소들을 출력하면 된다. 이때 0~ 원소 개수의 절반 값은 데이터를 "-"로 바꿔주어야 한다. n은 최대 100이라고 주어졌으므로 해당 문제를 풀때 필요한 버켓을 100까지 설정하고 코드를 작성하였다. 전체적인 코드는 다음과 같다. void ..
5주차 자유 문제 Prepare > Algorithms > Sorting 풀이 삽입 정렬 코드를 완성하는 문제이다. 삽입 정렬의 기본 알고리즘은 다음과 같다. 1. 리스트의 인덱스 0번 위치의 항목 한 개는 이미 정렬이 완료된 리스트로 취급한다. 2. 정렬 리스트의 오른쪽에 있는 정렬되지 않은 원소(1번 위치의 원소)는 자신의 앞에 있는 원소와 크기를 비교하여 앞쪽 원소가 더 크면 자리를 바꾼다. 3. 동일하게 2번 위치에 있는 원소도 왼쪽으로 전진하면서 자기 자리를 찾을 때까지 왼쪽으로 전진한다. 4. 이 과정을 더 이상 비교 대상 원소가 없을 때까지 반복한다. 위 알고리즘을 바탕으로 코드를 작성해 보았다. int main() { int n, temp, i, j; vector arr; cin >> n;..