일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- HTML
- Java
- OSI
- 큐
- windosws wbcs
- C
- ftz
- windosw 문자열
- 파이썬
- 스택
- War Game
- web
- 백준
- Stack
- pwnable.kr
- LoB
- level13
- 시간복잡도
- 정렬 알고리즘
- c언어
- 재귀
- 암호수학
- SWiFT
- ftz level13
- 미로 탐색 알고리즘
- System
- PHP
- 자료구조
- 두근두근 자료구조
- 파일 시스템
- Today
- Total
목록War Game/LOB (18)
나의 기록, 현진록
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 분..
LOB cobolt bash2 실행 다음은 goblin 파일의 코드이다. 간단한 문제이다. 버퍼 크기가 너무 작으니 환경변수를 사용하자. 환경변수에 쉘코드를 등록하고 쉘코드의 주소를 출력한다. ret까지의 거리를 알아보자. 0x10 -> 16byte 20byte부터 ret 주소이다. 페이로드 작성 페이로드를 작성할 때 goblin 파일의 코드는 실행인자가 아닌 gets으로 입력 받기 때문에 파이프라인을 사용하자.
LOB gremlin 다음은 cobolt 파일의 코드이다. 이것도 간단한 버퍼 오버플로우 문제이다. ret까지의 거리를 알아보자. 0x10 -> 16 20byte부터 ret의 주소이다. 20byte부터 쉘코드를 넣으면 된다. 이 문제는 ret까지의 거리가 비교적 적기 때문에 환경변수를 이용해 쉘코드의 주소를 입력해야 한다. 일반적으로 쉘코드의 크기는 적어도 보통 23byte~27byte 정도로 이는 ret까지의 거리 20byte를 초과하기 때문이다. 쉘코드의 주소를 알아보자. 페이로드 작성
LOB gate 제일 먼저 bash2 실행 bash 상태에서 한참을 고생했다. gremlin 파일은 gremlin 권한을 가진다. 쉘을 실행하면 gremlin 권한의 쉘을 가질 수 있다. 다음은 gremlin의 코드이다. 간단한 버퍼 오버플로우 문제이다. ret 주소에 쉘코드를 넣자. 먼저 ret까지의 거리를 알아보자. 0x100 -> 256 ret까지의 거리는 260이다. 쉘코드를 환경변수에 넣고 쉘코드의 주소를 출력하자. 다음은 쉘코드의 주소이다. 페이로드 작성 260부터가 ret 주소이므로 260을 nop으로 채운 후에 쉘코드를 입력한다.