일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- web
- Java
- pwnable.kr
- C
- System
- LoB
- windosw 문자열
- 정렬 알고리즘
- War Game
- Stack
- 큐
- ftz
- 암호수학
- ftz level13
- windosws wbcs
- SWiFT
- 시간복잡도
- 재귀
- 두근두근 자료구조
- 미로 탐색 알고리즘
- 파이썬
- 파일 시스템
- PHP
- c언어
- level13
- OSI
- 스택
- HTML
- 자료구조
- 백준
- Today
- Total
목록모두 보기 (257)
나의 기록, 현진록
선택 정렬 선택 정렬이란 리스트 중에 최솟값을 찾아 맨 앞의 값과 교체하는 정렬이다. 시간 복잡도는 평균 O(n2)으로 일반적으로 유사한 삽입 정렬보다 비효율적이며, 특히 큰 리스트에서 최악의 효율성을 가진다. 시간 복잡도의 최상은 O(n2), 최악은 O(n2)이다. 다음 영상은 선택 정렬의 동작 방식이다. 12345678910111213141516171819202122#include void selection_sort(int arr[], int len) { for (int i = 0; i
버블 정렬 버블 정렬은 인접한 두 원소를 비교하여 정렬하는 방법이다. 시간 복잡도는 평균 O(n2)로 느리고 비효율적이지만 코드가 단순하기 때문에 자주 사용된다. 시간 복잡도의 최상은 O(n), 최악은 O(n2)을 기록한다. 다음 영상은 버블 정렬 동작 방식이다. 1234567891011121314151617181920#include void bubble_sort(int arr[], int len) { for (int i = 0; i
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#include #include void frequencyCount(int *alphabetList, char *cipherText);void printAlphabetList(int *alphabetList);void changeText(char findAlphabet, char changeAlphabet, char *Text);void printText(char *text);void printChangeList(char *changeList); void main() { int..
LOB nightmare fgets 함수의 인자인 stdin 버퍼를 이용한다. ret 주소에 2byte는 \x90\x90이어야만 한다. stdin 버퍼 확인 fgets 함수가 끝난 main+26에 breakpoint 설정 AAAAAAAA 입력 후 stdin 확인 전과 다르게 주소가 저장되어 있다. 0x40015000 주소에 입력한 AAAAAAAA가 저장되어 있다. 이 주소에 쉘코드를 넣는다. 페이로드 작성 [ \x90\x90 2byte] [ shellcode 25byte ] [ \x90*17 17byte ] [ \x40015001 ] \x40015002도 된다.
LOB zombie_assassin 요약하면 다음과 같다. 공유라이브러리를 사용할 수 없다. ret 주소는 반드시 DO함수의 주소를 가진다. buffer 변수의 값을 모두 0으로 바꾼다. ret 주소 + 100byte 이후의 모든 주소를 0으로 바꾼다. LD_PRELOAD 방지. 최종적으로 check 변수의 저장된 값이 4가 되어야 system 함수를 호출할 수 있다. 처음 ret 값에 반드시 DO 함수의 주소를 가져야하므로 DO 함수의 ret 값에 GYE 함수의 주소를 입력한다. 나머지 함수들도 연쇄적으로 ret 값에 각각의 주소를 넣는다. MO 함수에 도달하여 system 함수를 호출하면 /bin/sh를 입력한다. 먼저 각 함수의 주소를 먼저 알아보자. 각 함수의 주소를 연속으로 입력해준 다음 MO ..
LOB assassin fake ebp SFP 값을 변조하는 문제이다. 48byte까지 제한이 있기 때문에 FEBP 기법을 사용할 수 있다. ret 값에 leave를 넣는 것이다. leave는 다음과 같다. 1. mov esp ebp 2. pop ebp 1. esp에 ebp 저장하여 esp, ebp 모두 SFP 값을 가리킨다. 2. pop에 의해 ebp+4 ret은 다음과 같다. 1. mov eip 2. jmp eip ret에는 leave 주소를 넣어줄 것이기 때문에 다시 leave가 실행된다. pop에 의해 ebp는 ebp+4가 저장되어 있고 leave의 mov esp ebp로 인해 esp에는 ebp+4가 저장된다. 그리고 ret에 의해 ebp+4로 이동한다. ebp+4에 buffer 주소를 넣고 bu..
LOB giant ret에 들어갈 최상위 비트가 \xbf 또는 \x40이 될 수 없다. 이 두 조건 이외의 ret에 관련된 다른 조건이 없으므로 이 부분만 우회하면 된다. ret 주소에 ret 주소를 넣어주면 우회할 수 있다. 그러면 그냥 ret을 한번 더 실행한다. 그리고 argv[] 영역을 이용해 쉘코드 넣어주자. 페이로드는 이렇게 구성될 것이다. [ ebp+44 ] [ ret ] [ ret ] [ argv[2] ] [ shellcode ] ret 값에 ret이 시작되는 주소를 넣으면 또 ret이 실행되고 그 다음 주소로 리턴된다. 여기서 그 다음 주소는 argv[2]이다. 다음은 ret 주소이다. argv[2]의 주소 오류 성공 페이로드 작성 system 함수를 이용할 수도 있다.
LOB bugbear execve의 주소와 argv[44]의 입력된 값이 같아야한다. execve함수를 이용한 RTL 기법을 사용해보자. 다음은 execve 함수의 간단한 설명이다. 설명 execve 함수는 새로운 프로그램을 실행시킴과 동시에 현재 프로그램을 종료한다. 사용법 execve (const char *filename, char *const argv [], char *const envp[]); 1. filename이 가리키는 파일을 실행한다. 2. argv는 새로 시작할 프로그램에 전달될 인자이다. 3. 설정된 환경변수를 사용한다. 페이로드는 1. main ret 값에 execve 주소를 덮어 함수를 실행한다, 2. execve 함수의 첫번째인자가 실행되고 exit 함수로 인해 바로 종료된다. ..
LOB darkknight 힌트는 RTL return to library 공유 라이브러리 영역을 이용하는 것이다. system 함수를 활용하기 위해 system 함수의 주소를 알아보자. system 함수의 주소는 0x40058ae0 /bin/sh의 주소를 알아내기 위한 코드 작성 /bin/sh의 주소는 0x400fbff9 system 함수의 인자 처리방식은 ebp+8 주소에 있는 인자를 가져온다. 페이로드 작성 ret값에 system 함수의 주소 AAAA (ebp+4) ebp+8에 /bin/sh 주소
LOB golem problem_child() 함수에서 40 크기의 buffer에 41만큼 복사한다. 1btye의 버퍼 오버플로우가 발생한다. 41byte은 SFP 영역이다. 위에 FPO라고 쓰여있는 게 보인다. Frame Point Overflow SFP 변조를 통해 버퍼 오버플로우 기법을 활용하는 문제이다. 40btye 이후에 1byte 만큼의 SFP를 변조할 수 있다. SFP 값이 변조되면 ret 값 또한 변조된다. 페이로드는 아래와 같이 구성될 것이다. [NOP] [SHELLCODE] [1byte]|--------40byte-----| |1byte| 그렇다면 SFP 값에 덮어야할 주소는 무엇일까? 어쨌든 최종적으로 쉘코드가 있는 buffer에 접근해야할 것이다. gdb로 분석을 해보자. main+..