System&Write up 87

FTZ level17 -> level18 Write up

FTZ 17 Level ID : level17Passwd : king poetic 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령으로 hint를 열어봅니다.level16과는 다르게 쉘을 띄워주는 shell 함수는 없네요. 그럼 환경 변수에 쉘을 띄우는 코드를 넣어주고 call 함수 포인터에 환경 변수의 주소를 넣어주면 될 것 같습니다. call 함수 포인터의 위치와 환경 변수의 주소를 찾아봅시다. call 함수 포인터의 위치를 찾기 위해서 tmp로 복사하고 디스어셈블 해봅시다. main+6의 코드를 보면 C언어의 void (*call)()=printit; 부분인 것 같습니다.함수의 이름은 함수의 시작 주소를 가리키기 때문에 call 함수 포인터에는 printit 함수의 주소가 들어있습니..

System&Write up/FTZ 2017.09.27

FTZ level16 -> level17 Write up

FTZ 16 Level ID : level16Passwd : about to cause mass 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령으로 hint를 열어보면 코드가 있는데요. call이라는 이름을 가진 함수 포인터에 printit 함수를 넣고 buf 배열을 선언합니다. 그리고 call에 있는 함수를 호출합니다. 지금까지 했던 Overflow를 보면 뭔가 call 함수 포인터에 있는 함수의 주소를 printit 함수에서 shell 함수로 변조하면 될 것 같은 느낌이 옵니다. 그럼 call 함수 포인터의 위치와 shell 함수의 주소를 찾아야합니다. tmp로 복사하고 gdb로 디스어셈블 해봅시다. fgets 함수의 첫 번째 인자는 buf의 시작 주소이고, call 하기 전 마지막..

System&Write up/FTZ 2017.09.25

FTZ level15 -> level16 Write up

FTZ 15 Level ID : level15Passwd : guess what 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령어로 hint를 열어보면 level14와 다른 점이 하나 있습니다. level14에서는 check 변수가 int형이였지만 level15에서는 check 변수가 int * (포인터) 형이라는 것입니다. level14에서는 ebp-56 ~ ebp-16 만큼 dummy 값을 채워주고 check 값을 0xdeadbeef로 변조합니다. level15에서는 ebp-56 ~ ebp-16 만큼 dummy 값을 채워주고 check 값을 0xdeadbeef를 담고있는 메모리 주소로 변조합니다. 그럼 0xdeadbeef가 어디에 위치하고 있을까요? 데이터를 코드 내부에 직접 입력하..

System&Write up/FTZ 2017.09.25

FTZ level14 -> level15 Write up

FTZ Level 14 ID : level14Passwd : what that nigga want? 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령어로 hint를 열어봅니다. buf에 fgets로 크기 제한을 두고 값을 입력 받습니다. 하지만 buf의 크기는 20byte. 크기 제한이 조금 잘못된 것 같습니다. 그리고 지금까지와는 다르게 셸코드를 통해서 쉘을 띄우는 게 아니라 조건에 맞으면 알아서 띄워줍니다. tmp에 복사하고 gdb로 열어 main 함수를 디스어셈블 해봅시다. fgets 함수에서 첫 번째 인자, 즉 마지막으로 push하는 인자가 buf의 시작 주소가 될 것입니다. main+17을 보면 buf의 시작 주소가 ebp-56입니다.main+29를 보면 check의 주소가 eb..

System&Write up/FTZ 2017.09.25

FTZ level13 -> level14 Write up

FTZ 13 Level ID : level13Passwd : have no clue 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령어로 hint를 열어보면 i를 0x1234567로 초기화하고 buf를 선언하고 argv[1] 값을 buf에 복사하고 i가 변조 되었으면 프로그램을 종료시키는 코드입니다. 즉 Return Address를 변조하려면 i 값을 지나가는데 변조는 시키지 말아야한다는 것입니다. 그럼 i의 위치를 알아야겠죠?attackme 파일을 tmp로 옮기고 gdb로 디버깅 해보겠습니다. main 함수를 디스어셈블 해보면 함수 프롤로그가 끝나고 0x418만큼의 공간을 할당해줍니다. 0x418은 10진수로 1048입니다. long i가 4byte, buf의 크기가 1024byte인 ..

System&Write up/FTZ 2017.09.25

FTZ level12 -> level13 Write up

FTZ 12 Level ID : level12Passwd : it is like this 접속해서 ls 명령어로 파일과 디렉터리를 확인합니다. cat 명령어로 hint를 열어보면 level11과는 달리 level12에서는 문자열을 gets 함수로 받고 있습니다. main 함수의 인자로 받을 때와 다르게 gets는 코드가 어느정도 실행 된 후에 입력을 받기 때문에 다른 방식으로 넘겨줘야 합니다.level11 : ./attackme argv[1] 였다면level12 : (python –c ‘print “문자열”’; cat) | ./attackme이렇게 | (파이프)를 써서 전달하게 됩니다. 메모리 구조는 level11과 동일합니다. 같은 payload를 사용하겠습니다.level11 Write Up : htt..

System&Write up/FTZ 2017.09.24

FTZ level11 -> level12 Write up

FTZ 11 Level ID : level11Passwd : what!@#$? 접속해서 ls 명령어를 이용해서 디렉터리와 파일을 보면 attackme라는 실행 파일과 hint라는 파일이 있습니다. attackme를 보면 level12의 setuid가 걸려있는 걸 확인할 수 있습니다. cat 명령을 이용해서 hint를 열어보면 attackme의 소스가 나옵니다. main 함수에서 인자를 받고 strcpy를 이용해서 str이라는 배열에 복사하고 printf 함수로 출력하는 것을 확인할 수 있습니다. 하지만 strcpy라는 함수는 얼마나 복사할지 길이의 제한을 두지 않기 때문에 프로그래머가 고려하지 못한 오류가 발생할 수 있습니다. 이렇게 배열 크기보다 작은 크기의 문자열을 입력하면 프로그램은 정상적으로 돌아..

System&Write up/FTZ 2017.09.24
반응형