본문 바로가기
반응형

분류 전체보기167

LOB Level 2 gremlin Level 2로 접속합니다. cobolt 파일을 이용하여 공격하라고 합니다. 소스파일을 보면 Level 1과 큰 차이점이 없습니다. 한가지 차이점이 있다면 Level1에서는 환경변수를 이용하지않고 바로 쉘코드를 삽입할 수 있었지만 여기서는 버퍼의 크기가 16바이트이므로 바로 쉘코드를 삽입하는데 무리가 있습니다. 환경변수를 이용하여 문제인 것 같습니다. gdb를 사용하여 메모리 구조를 그려보면 ret4 sfp4 buffer16 입니다. 이번에도 더미가 없습니다. 쉘코드를 환경변수로 올려주고 getenv로 주소값을 알아내어 공격코드를 작성합니다. ./cobolt `python -c 'print "\x90"*20 + "\xfd\xfd\xff\xbf"'` 2021. 8. 9.
LOB Level 1 gate ID : gate PW : gate (LOB는 telnet으로 접속합니다.) gremlin 파일을 이용하여 공격을 해야할 것 같습니다. 소스코드를 보면 256바이트의 배열 하나가 선언 되어있습니다. 그리고 strcpy가 보입니다. Level 1이라서 그런지 생각보다 간단한 문제입니다. gdb를 사용하여 보면 총 256바이트의 메모리가 할당된 것을 알 수 있습니다. (0x100) 메모리 구조를 그려본다면 ret4 sfp4 buffer256 이렇게 더미값이 없습니다. 공격방법을 생각하면 260바이트의 값을 nop으로 채워주고 ret부분에 환경변수로 등록해놓은 쉘코드의 주소를 넣어주면 되겠습니다. ./gremlin `python -c 'print "\x90"*260 + "주소"'` 쉘코드를 환경변수로 올려줍니.. 2021. 8. 9.
FTZ Level 20 마지막 문제입니다. 힌트를 보면 프로그램은 생각보다 간단한듯한데 fgets의 옵션에 79가 있네요... 최대 길이를 79바이트로 제한했습니다. 버퍼오버플로우가 안되는 듯 하네요ㅠㅠ 그런데 이때 printf함수를 보면 인자를 사용했죠? 여기서 포맷스트링 버그가 발생합니다. 여기서 printf(bleh); 이렇게 함수를 사용하게 되면 문자열을 출력하다가 %x 등을 만나면 이들을 문자열로 보지 않고 서식문자로 인식해버립니다. 문자열을 출력하다가 이 문자들(%d, %x, %s 등)을 만나면 메모리의 다음 4바이트를 참조해서 출력하는 것입니다. 메모리 구조를 살펴보기 위해서 gdb를 사용합니다. 확인이 안되네요. 그럼 지금까지의 힌트를 가지고 구조를 유추해보면 RET4 SFP4 DUMMY? bleh80 DUMMY.. 2021. 8. 9.
FTZ Level 19 FTZ Level 19에 접속하여 힌트를 봅니다. 이제 소스만 보고도 구조가 대충 그려지네요. gdb를 사용하여 더미가 20byte인것도 확인합니다. 메모리 구조는 RET4 SFP4 Dummy20 buf20 입니다. 간단한 소스입니다. 그런데 평소처럼 eggshell과 getenv를 사용했는데 아무런 반응이 없습니다. 다시 소스를 보니 seteruid가 없네요;; 그렇다면 seteruid를 설정하는 쉘코드를 eggshell에 같이 넣어주면 됩니다. ㅎㅎ grep을 이용해 레벨 20의 uid를 확인합니다. grep level20 /etc/passwd uid를 설정하는 코드를 만들어서 쉘코드로 작성하여 줍니다. 작성한 프로그램을 gcc에 -static -g 옵션을 주어 컴파일 한 후, gdb로 main 함수.. 2021. 8. 9.
FTZ Level 18 Level 18에 접속해서 힌트를 봅니다. 이전과는 다르게 길이가 제법 되는 코드들이 나오는데요;; 우선 check는 string 뒤에 위치합니다. 그럼으로 기존의 버퍼오버플로우를 시키는 방식은 사용할 수 없습니다. 이를 해결하기 위해 case문이 있네요 이 부분 입니다. 메모리 0x08이 입력되면 count--가 됩니다.(버퍼를 한개 빼주는 역활입니다.) 그리고 string[count-1] = x; 가 되는 것이죠. 그렇다면 string[-1] = x;의 경우 string의 시작주소보다 1바이트 낮은 곳에 x의 값이 저장됩니다. string[-2]의 경우는 2바이트 낮은 곳이겠지요. 그럼으로 0x08을 이용하여 cout--를 일으켜 check에 deadbeef를 넣어주면 됩니다. 메모리 구조를 보면 R.. 2021. 8. 9.
FTZ Level 17 Level 17에 접속해서 힌트를 보면 Level 16에서의 코드에서 shell함수가 빠진 형태입니다. 그렇다면 메모리 구조는 비슷할 것입니다. buf의 20byte와 더미값 20byte를 채운 후, 포인터함수 부분을 환경변수로 등록해놓은 쉘코드의 주소를 넣어주면 됩니다. 쉘코드가 실행시키게 하면 되는 것입니다. 에그쉘과 getenv를 사용하면 됩니다. (python -c 'print "A"*40 + "쉘코드 주소"';cat)|./attackme 2021. 8. 9.
반응형