일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ftz level13
- 시간복잡도
- 큐
- ftz
- 스택
- 백준
- 재귀
- HTML
- 암호수학
- 자료구조
- level13
- 정렬 알고리즘
- Java
- windosw 문자열
- C
- Stack
- OSI
- LoB
- 파일 시스템
- pwnable.kr
- System
- 미로 탐색 알고리즘
- 두근두근 자료구조
- c언어
- PHP
- web
- 파이썬
- SWiFT
- War Game
- windosws wbcs
- Today
- Total
목록War Game (41)
나의 기록, 현진록
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+..
LOB skeleton buffer로부터 +44~48 byte 바이트를 제외하고 모두 0으로 초기화된다. ret이후부터 0xbfffffff까지의 영역은 ret부터 커널 전까지의 영역을 말한다. 어디 영역을 사용해야 하는 것일까? 공부할 때 모르는 부분이 있을 때는 답안을 보고 공부를 하는 것도 한가지 방법이라고 생각한다. 다른 블로그를 보고 공유 라이브러리를 이용하는 문제라는 것을 알게 되었다. 다음은 메모리의 구조이다. [kernel] [program name] [env] [argv] -중략- [buf] [ret] [공유 라이브러리] [heap] [data] 커널 이후부터 (0xbfffffff) ret까지 초기화 된다면 공유 라이브러리는 초기화 되지 않을 것이다. 프로그램을 시작할 때 공유 라이브러리가..
LOB vampire 다음은 skeleton의 소스 내용이다. 버퍼, 환경변수, argv 영역 모두 사용할 수 없다. 어떤 영역을 사용해야 할까? 먼저 원본 파일을 복사하고 스택이 초기화되지 않은 영역을 찾아보자. 프로그램이 종료되기 전 브레이크 포인트 설정 스택이 끝나기 전 초기화되지 않는 부분을 볼 수 있다. 파일 이름이 스택에 저장된 것이 확인 되었다. 실제로 stack layout은 이렇게 구성된다. 프로그램의 이름이 맨 끝에 초기화되지 않고 저장된다. 파일 이름을 쉘코드로 한 후 파일 이름의 주소를 ret 주소에 덮어준다. 앞 뒤에 안전하게 NOP을 적정량 입력해준다. 세그먼트 오류로 ret 값에 들어갈 주소가 잘못 되었는 것을 알 수 있다. 0xbfffff35가 정확한 주소이다. 성공 복사한 ..
LOB troll 기존의 조건이 많이 사라졌다. 그러나 \xbfff****영역을 사용하지 못한다. 스택이 쌓여지는 초기 영역을 사용하지 못한다면 스택을 한참 쌓아올리고 \xbfff 영역을 벗어난 후의 영역을 사용해야 한다. 스택의 특징을 이용하면 될 것 같다. 쌓여질 수록 주소가 점점 낮아지는 스택은 데이터를 많이 넣으면 낮은 주소의 영역을 접근한다. 일단 쉘코드를 넣을 주소를 알아보자. 원본 파일을 복사한 후에 gdb 실행 먼저 NOP을 1만개 입력하면 스택은 esp는 어디까지 접근할 수 있을까 아직 \xbfff 영역이다. 10만개의 NOP 입력 esp가 \xbfff 영역을 벗어났다. NOP은 \xbffe75d9 영역부터 채워진다.이 위치가 argv[1]이다. argv[1]에 쉘코드를 넣어보자. 성공 ..
LOB orge darkelf에서 argv hunter 조건이 추가되었다. argv[1]의 내용을 모두 0으로 수정하는 코드이다. argv[1]과 buffer를 사용할 수 없으니 argv[0]을 사용해보자. argv[0]은 실행 파일이다. 실행 파일을 쉘코드로 바꾸면 될 것 같다. 그 전에 argv[0]의 주소를 알아보자. 파일 이름은 AAAA이므로 41414141이 저장되었을 것이다. 0xbffffc6d가 argv[0] 주소이다. argv[0] 주소를 알았으니 파일을 복사해 페이로드를 입력해본다. (굳이 파일을 복사하는 이유는 오류 시 core dump 하기 위한 목적이다.) troll 파일을 복사한다. 이때 복사파일의 이름을 쉘코드로 하는데 \x2f가 포함된 쉘코드는 사용할 수 없다. '\x2f' 는..
LOB darkelf 다음은 orge.c의 내용이다. check argv[0] 조건이 추가되었다. 그 내용은 argv[0]의 길이가 77개를 필요로 한다. argv[0]은 실행인자를 뜻한다. 실행인자의 길이가 77이어야 한다. ./////// --중략--/////home/darkelf/orge 이렇게 실행해도 되고 orge파일과 파일이름이 77개인 심볼릭 링크를 설정해도 된다. ret 값에 argv[1] 주소를 넣어서 풀어보도록 할 것이다.. argv[1] 의 주소를 알아보자 main에 브레이크 포인트 설정 argv[1] 주소는 0xbffffc31 넉넉하게 0xbffffc44 argv[1]의 주소가 아닌 듯 하다. core dump 0xbffffb9e가 argv[1]의 주소이다. 내용은 그대로 orge파..
LOB wolfman check length of argv[1] 조건이 추가되었다. 실행인자의 길이가 48을 넘으면 안 된다. gdb 분석을 위해 복사 buffer와 argv[1]을 헷갈리 수 있으므로 buffer에 저장하지 않도록 그 위치에 브레이크 포인트 설정 0xbfffc2c부터 문자열이 저장된다. argv[1]의 위치이다. 페이로드 작성 if(argv[1][47]) 문을 빠져나오면 ret 값에 argv[1]의 주소가 입력되어 다시 argv[1]로 찾아갈 때 쉘코드를 발견하고 실행할 것이다.
LOB orc 먼저 bash2 실행 goblin에서 buffer hunter가 추가된 문제 egghunter에 의해 환경변수를 사용할 수 없다. 또한 추가된 buffer hunter에 의해 buffer 배열을 사용해 문제를 풀 수 없다. argv[]를 이용해 문제를 푼다. gdb를 실행한 다음 입력된 문자열이 buffer 배열에 저장되기 전 위치에 브레이크 포인트를 설정한다. 48번째 \xbf가 아닐 시 exit함수에 의해 종료되므로 이점을 인지하고 문자열을 입력한다. 0xbfffc44부터 문자열이 저장된다 argv[] 위치이다. ret 주소에 적당한 NOP과 함께 쉘코드를 입력한다. 페이로드 작성
LOB goblin 가장 먼저 bash2 실행 다음은 orc 파일의 소스 내용이다. if 문이 두개와 for문 한개가 있다. 첫번째 if문은 실행 인자가 없을 경우 종료 for문에서 environ은 extern으로 선언되었다. extern은 외부참조 변수이다. 즉, 환경 변수라고 이해할 수 있다. for문의 내용을 보면 environ의 내용을 전부 0으로 바꾼다. 환경변수를 참조할 경우 그 내용을 모두 0으로 바꾼다는 의미이다. 환경변수를 사용할 수 없다. 두번째 if문은 실행인자의 48번째 문자가 \xbf 가 아닐 경우 종료한다. 그렇다면 환경변수를 쓰지 않고, 48번째 문자가 \xbf인 상태로 쉘코드를 실행하면 된다. 일단 gdb로 더 알아보자. orc 파일을 복사해야 goblin 권한으로 gdb 분..