목록분류 전체보기 (126)
SH1R0_HACKER
stack5.c #include #include #include #include int main(int argc, char **argv) { char buffer[64]; gets(buffer); } gets()를 통해 버퍼오버플로우를 일으킬 수 있을 것 같다. 이번엔 쉘코드를 이용하여 RET를 공격해보는것이 목표이다. [ ASLR(Address Space Layout Randomization) ] 메모리 영역의 주소 공간 배치를 랜덤화하여 공격을 방해한다. 즉 프로세스가 메모리에 올라갈 때 힙, 스택, 공유 라이브러리의 위치를 랜덤하게 정해주는 것. 출처: https://satanel001.tistory.com/77 간단한 ASLR 우회/차단 기법 스택의 주소가 필요한 공격을 할때 상당히 짜증나는 보호..
stack4.c #include #include #include #include void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { char buffer[64]; gets(buffer); } stack3와 비교했을 때 fp만 없어진 코드이다. fp가 없어도 ret를 사용해 실행흐름을 변경할 수 있다. [ DEP 우회 RTL 공격기법 (Return To Libc) ] 메모리 보호기법 DEP(Data Execution Protection)란? 데이터 영역에서 코드가 실행되는 것을 막는 기법이다. BOF의 기본 공격루트는 버퍼에 쉘코드 넣고 쉘코드를 가리키는 주소를 EIP에 overwrite하여 ..
stack3.c #include #include #include #include void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { volatile int (*fp)(); char buffer[64]; fp = 0; gets(buffer); if(fp) { printf("calling function pointer, jumping to 0x%08x\n", fp); fp(); } } 새로운 win() 함수가 등장했다. 우리의 목표는 이 함수를 실행시키는 것이다. 하지만 main 함수에 win() 함수를 실행하는 부분은 존재하지 않아서 fp를 변조해야 할 것 같다. [ 취약점 파악 및 분석 ] ..
stack2.c #include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; variable = getenv("GREENIE"); if(variable == NULL) { errx(1, "please set the GREENIE environment variable\n"); } modified = 0; strcpy(buffer, variable); if(modified == 0x0d0a0d0a) { printf("you have correctly modified the variable\n"); } else { printf("Try again,..
Stack1.c #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } } 코드를 분석해보면 main 함수에 argc와 argv가 전달된다. 사용자로부터 argument를 받아서 실해오디는 루틴을 가지고 있다. modified를 0x61626364로 바꿔버리면 우리가 원하는 답을 얻을 수 있을 것 같다. [ 취약점 파악 및 분석 ] 아래는 ..
Stack 0.c #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } } 코드를 분석해보면 modified가 0이 아닐 때 우리가 원하는 "you have changed the 'modified' variable\n" 메시지를 띄울 수 있을 것 같다. 먼저 취약해 보이는 gets가 보인다. gets()는 키보드로부터 문자열을 입력받아 버..
실행 gdb "파일명" 인텔형 어셈블리어로 보기 set disassembly-flavor intel 메인 함수 디스어셈블하기 disas main 브레이크 포인트 걸기 b *main 메인 함수에 브레이크 포인트 b *0x00000000004005bd 특정 주소에 브레이크 포인트 b "숫자" eip로부터 상대적 위치에 브레이크 포인트 브레이크 포인트 삭제 delete delete "번호" 실행하기 run "args" 처음부터 실행하기 continue 멈춘 부분부터 계속 실행하기 ni 한 스탭 실행 후 멈추기 정보 확인 info reg 레지스터 확인 info reg "레지스터" 특정 레지스터 확인 info break 브레이크 포인트 확인 x/t "메모리 주소" 2진수로 확인하기 x/o "메모리 주소" 8진수로..
del, append(), insert(), remove(), pop(), sort(), reverse(), index(), count(), extend() 1. 리스트 만들기 - 형식 : 리스트명 = [요소1, 요소2, 요소3, ...] # 숫자, 문자열, 리스트 자체를 요소로 가질 수 있다. a = [3, 9, 7, 1, 5, 'Hi', ['Py','thon']] 2. 리스트안에 있는 리스트 출력하기 a = [3, 9, 7, 1, 5, 'Hi', ['Py','thon']] print(a[6][0]) # 'Py' 출력 3. 리스트 슬라이싱 (a[0:3]일 때 범위는 a[0]이상 a[3]미만이다.) a = [3, 9, 7, 1, 5] print(a[0:3]) # [3..
len(), map(), input(), split(), format(), f, upper(), lower(), lstrip(), rstrip(), strip(), replace() 1.문자열 곱하기 print("*"*10) print("안녕?") print("*"*10) # 출력 결과 # ********** # 안녕? # ********** 2. 문자열 길이 출력 x = "Hello World!" print(len(x)) # 12가 출력된다. 3.문자열 슬라이싱 a = "Hello World!" print(a[0:5]) # Hello만 출력된다. # a[0:5] => 0~4까지 출력 (범위 : 0
1. print 함수를 이용한 Hello World! 출력하기 print('Hello World!') # Hello World! 를 출력합니다. 2. 변수를 생성하고 숫자 계산하기 - input() 함수로 변수를 여러게 입력받기 위해서는 split() 함수를 사용한다. - split()결과를 정수 또는 실수로 변환하려면 map()함수를 이용하여 변환한다. x, y = map(int, input().split()) # 값 2개를 입력받아서 x, y변수에 정수로 저장합니다. # 정수형(정수) : int # 실수형(소수점이 포함된 수) : float print(x+y) # x+y의 결과를 출력합니다. # 덧셈 : x+y # 뺄셈 : x-y # 곱셈 : x*y # 나눗셈(결과는 실수형) : x/y # 몫 나눗셈..