본문 바로가기
반응형

Security/Pwnable70

LOB Level 5 orc Level5 orc -> wolfman 으로 접속합니다. 우선 힌트를 봅시다! 에그헌터 있고 버퍼 초기화하는게 있네요. 전체적인 메모리구조를 RET4 SFT4 buffer40 int4 이렇게 유추해봅시다. GDB로 까보면 main+3에서 44바이트가 할당된것을 알 수 있습니다. 4바이트RET 4바이트SFP 40바이트BUFFER 4바이트i 이제 buffer 의 주소를 알아내기 위해 break걸고 살펴보려고 하는데 퍼미션... 파일을 복사해서도 해보는데 퍼미ㅕㅅㄴ..... 다른 방법을 찾아보던중에 힌트로 제공된 소스 코드를 복사하여서 현재 버퍼의 주소를 출력해주는 코드를 추가합니다. printf("0x%x\n", buffer); 그리고 컴파일 후 실행합니다. 버퍼의 주소를 알아냈습니다. 0xbffffa70 .. 2021. 8. 9.
LOB Level 4 goblin Level 4 goblin > orc 로 접속합니다. 소스를 살펴보면 이번에는 에그쉘을 쓰지 못하네요 egghunter에서 환경변수는 주소를 모두 0으로 만들어 버리네요 그리고 argv[1][47]이 \xbf여야 한다네요. 우선 gdb를 사용해 메모리 구조를 나타내면 RET4 SFP4 BUFFER40 i4 가 됩니다. 이번에도 더미값은 없네요 대충 공격코드를 작성해보면 nop(44byte) + ret + nop + shellcode 가 되겠군요 buffer의 주소를 알아내기 위해 gdb를 활용합니다. strcpy함수가 호출되고 난 후의 부분에 break 를 걸고 살펴보려는데... 권한문제 ;; orc프로그램을 따로 컴파일해서 해보았으나 주소가 맞지않아 안되네요.. 다른 방법을 찾던중 orc 소스파일 자체.. 2021. 8. 9.
LOB Level 3 cobolt Level 3 cobolt로 접속합니다. goblin의 소스파일을 보면 Level2와 유사합니다. 차이점은 strcpy함수 대신 gets함수를 사용하였습니다. 메모리구조도 똑같네요 low - buffer 16 - sfp 4 - ret 4 - high 입니다. 바로 익스플로잇 코드를 작성합시다. 쉘코드를 환경변수로 올려주고 getenv로 주소를 알아낸 후 (python -c 'print "\x90"*20+ "\x주소"';cat)|./goblin 실행하면 됩니다. 2021. 8. 9.
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.
반응형