목록전체 글 (370)
cgy12306
ID : level17 PW : king poetic 이번에도 버퍼오버플로우이다. main+6에서 ebp-16지점에 0x8048490을 넣어주고, main+57부분에서 ebp-16지점의 값을 eax를 넣고 eax를 call 해준다. 스택을 보면 이렇다. 16번에서 숫자만 살짝 바꿨다. 그러면 ebp-16지점에 쉘 코드가 들어있는 주소를 넣어주면 쉘이 실행될것 같다. 쉘 코드를 환경변수에 등록하고, 쉘 주소를 알아보자. 쉘 코드가 들어있는 주소를 획득했다. A를 40byte만큼 넣어주고 쉘 코드가 들어있는 주소를 넣어 실행시켜보자~~~ 비밀번호는 why did you do it이다.
ID : level16 PW : about to cause mass 이번에도 버퍼오버플로우 문제인듯 하다. 디버깅을 해보자. main+6을 보면 ebp-16지점에 0x8048500를 넣는다. 참고로 8048500은 printit의 함수의 시작주소이다. main+36부분에서 ebp-16지점에 있는 값을 eax에 넣고 main+39에서 eax를 호출한다. main 함수를 한 줄씩 실행해보자. 우선 main에 break point를 걸어주고, r으로 프로그램을 실행하고, ni로 한 줄씩 실행해보자. print해주는 함수가 실행된다. c 코드에서 shell함수를 우리가 호출해야하는데 ebp-16지점에 shell 함수의 시작지점을 넣어주면 될 듯 하다. shell 함수의 시작주소는 0x080484d0이다. 그러면..
ID : level15 PW : guess what 14번이랑 다른점은 포인터를 이용한다는 점이다. 디버깅 해보자. 14번과 유사하다. 하지만 main+32 부분을 보면 eax 주소안의 있는 값과 0xdeadbeef와 비교한다. 이 부분이 제일 헷갈렸다. 나의 이해 방식은 main+32 부분에서 DWORD PTR[eax]를 그냥 eax로 바꾼다면 ebp-16의 위치에 있는 값과 0xdeadbeef와 비교를 하는 것이다. 그러면 ebp-16에 0xdeadbeef를 넣으면 되겠지만 현재의 문제는 DWORD PTR[eax]와 0xdeadbeef를 비교하는 것이다. 그러면 ebp-16의 위치에 0xdeadbeef가 있는 주소값을 넣어주면 해결 된다. 우선 스택구조는 이렇다. 저 ebp-16 자리에 0xdeadb..
ID : level14 PW : what that nigga want? 디버깅을 해봅시다. main+29부분을 보면 ebp-16이 0xdeadbeef와 비교하는 것을 볼 수 있다. 스택을 그려보자. (저는 아날로그적인 것을 좋아합니다) A를 40byte 만큼 넣어주고 다음 0xdeadbeef를 넣어준다. 0xdeadbeef를 넣어줄 땐 리틀 엔디안 방식으로 넣어준다. 우선 쉘코드 작성하고 쉘코드 주소를 알아내자. 주소를 얻었으니 코드를 작성해보자. 비밀번호는 guess what이다.
ID : level13 PW : have no clue 이번에도 버퍼오버플로우 취약점을 이용한 문제이다. 디버깅을 해보자. 버퍼를 1048byte만큼 할당을 해준다. 그러면 일단 A를 1048byte 넣어보자. Buffer Overflow 라고 프린트된다. main +69 부분을 보게 되면 ebp-12와 0x1234567을 비교하는 것을 볼 수 있다. 그러면 우리는 ebp-12부분에 0x1234567을 넣어주면 된다. strcmp함수가 호출되기 전까지 스택을 그려보자. A를 1036byte를 넣어주고 이후에 0x1234567을 넣고 다시 A를 ebp까지 덮어준 후 ret부분에 쉘 코드 주소를 넣어주면 될것 같다. 해보자. 쉘 코드 환경변수에 넣어주고 주소를 알아내는 c코드를 작성 주소를 얻었다. 이제 명..
ID : level12 PW : it is like this 11번과 비슷한것 같다. gets 함수 또한 버퍼오 버플로우 취약점이 존재한다. 일단 실행해보자. attackme를 복사해서 디버깅해보자. 스택구조는 이렇다. 11번과 똑같은 스택구조를 가진다. 우선 환경변수에 쉘 코드를 입력해준다. 쉘 코드가 들어있는 c언어 코드로 위치를 알아낸다. 주소를 알아냈다. 코드를 입력해보자. python 명령어 부분이 들어가질 않는다. 이유는 11번에서는 argv[1]로 받아오기 때문에 뒤에 입력을 바로 줄 수 있었지만 이번 문제에서는 문구가 출력된 후 입력을 줘야한다. 파이프 문자( | )를 이용해보자. 파이프 문자는 표준출력을 표준입력으로 넘겨준다. 값은 들어갔지만 쉘을 획득하지 못했다. 이 부분은 너무 답답해..
ID : level11 PW : what!@#$? strcpy 취약점을 이용해 버퍼오버플로우를 일으켜서 쉘을 획득하는 코드인것 같다. 우선 디버깅 해보자. strcpy함수 호출 직후의 스택구조를 그려보면 이렇게 된다. 여기서 A라는 글자를 264byte(str)+4byte(ebp)+4byte(ret) 해주면 RET까지 A가 들어갈 것이다. 이러한 점을 이용해 RET에 쉘을 획득해주는 코드의 주소를 넣어주게 되면 RET은 주소를 쉘코드가 있는 주소로 가게되어 주소를 획득하게 된다. 우선 쉘코드를 환경변수에 등록하자. 쉘 환경변수의 위치를 알려주는 c코드를 작성하자. 쉘 코드의 주소는 0xbffffea6이다. 이제 A를 268개를 넣어주고 뒤에 이 쉘 코드의 주소를 넣어보자. 쉘코드의 주소는 리틀엔디안 방식..
ID : level10 PW : interesting to hack! hint 공유 메모리를 도청해야한다. 공유 메모리는 key 값을 이용해 A가 공유 메모리를 생성하면, B가 key값으로 인증해서 메모리를 공유하는 방식이다. 출처 : http://forum.falinux.com/zbxe/index.php?mid=C_LIB&document_srl=423456 C 라이브러리 함수 - shmget() 공유 메모리 생성 forum.falinux.com 공유메모리를 이용한 코드를 짜보자. 메모리를 공유하기 위해 sys/shm.h 와 sys/ipc.h를 선언해주고, key_t 변수에 key값인 7530을 넣어준다. shm_id=shmget(key, 300, IPC_CREAT)는 공유메모리 공간을 가져온다. 없으면..
ID : level9 PW : apple open hint 버퍼 오버플로우에 관한 문제인 것 같다. 코드를 분석해보자. 우선 buf2와 buf에 10만큼 캐릭터형 변수를 선언해준다. "It can be overflow : "를 출력해주고, buf에 40-1만큼 입력을 받거나 개행문자까지 입력을 받는다. 다음 if 문에서 buf2와 "go"를 2바이트 비교해서 같으면 Good Skill을 출력하고 setuid 3010을 획득하게 되며 쉘을 실행하게 된다. 이 파일을 디버깅 해보자. 안되는 것 같다. c파일을 생성해서 직접 실행파일을 만들어서 디버깅 해보자. 디버깅 후 인텔 형식으로 바꿔준다. 이제 메인 함수를 살펴보자. 스택 구조를 그려보니 ebp -24 부분이 go와 같은지를 물어보는 문제이다. a를 1..
ID : level8 PW : break the world hint 확인 용량 2700짜리인 shadow 파일이 있다고 한다. 하지만 용량의 단위가 뭔지 알려주지 않았다. 디폴트는 512byte로 되어있다. 그래서 나는 byte단위로 찾기위해 용량뒤에 c를 붙일 것이다. k는 kb, w는 2byte이다. find 명령어에서 size로 파일을 찾는 것은 -size 옵션을 주고 뒤에 수를 넣는데 +숫자를 하면 숫자 이상의 크기의 파일을 찾고 -숫자를 넣어주면 크기 이하의 파일을 찾아주고 그냥 숫자를 넣어주면 딱 맞는 크기의 파일을 찾아준다. find / -size 2700c 2>/dev/null을 해준다. 여기서 2의 의미는 표준 에러를 의미한다. 1은 표준 출력이다. 또 /dev/null은 유사 쓰레기통이..