본문 바로가기

워게임200

FTZ - level18 hint 구글링 - 멀티 플렉싱 - 멀티 셀렉트 서버 하면 file descriptor와 관련된 select 함수에 대한 설명이 나온다. hint 분석 FD_ZERO(&fds) ☞ fd_set fds를 0으로 초기화한다. FD_SET(STDIN_FILENO, &fds) ☞ STDIN_FILENO : 표준입력(fd = 0)/ fds의 0번째를 1로 셋팅 if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1 ) ☞ select 함수는 데이터가 변경된 파일의 개수, 즉 fd_set에서 비트 값이 1인 필드의 개수를 반환/ 비트값이 1인 필드의 개수가 1개 이상이라면 if( fd_isset(fileno(stdin), &fds ) ☞ fileno 함수 : 파일 포인터를 넘겨.. 2021. 7. 26.
FTZ - level17 hint 이번에도 void (*call)() = printit; 에서 printit의 주소대신 쉘코드의 주소를 넣어주면 될 것 같다. 지금 생각나는 풀이는 환경변수에 쉘 코드 넣고 그 환경변수의 주소로 덮어쓰기 export MYSHELL=$(python -c 'print "\x90"*0x1000 + "쉘코드"') 엄청 큰 nop를 가지고 끝에 쉘코드가 붙어있는 환경변수를 만든다. 스택 구조상 환경변수는 가장 위쪽 주소인(0xc0000000)에 가깝게 위치할 것이며, 환경변수와 기타 등등 main함수가 시작되기 전까지 쌓인 스택이 그리 많지 않을 것이다. 그러므로 0xc0000000 - 0x1000 위치로 익스플로잇을 해주면 nop를 건너뛰고 쉘 코드가 실행될 것이다. (나는 0xc0000000 - 0x1.. 2021. 7. 26.
FTZ - level16 hint 이번엔 attackme만 있는게 아니라 attackme.c도 있다. 그런데 attackme.c는 열리지도 않고 tmp폴더로 복사도 안된다. attackme만 tmp로 옮겨서 gdb로 까봤다. hint에 나와있는 그대로인 것 같다. 항상 BOF하던대로 하는데, void (*call)() = printit 에서 printit 대신 shell함수의 주소를 넣어주면 된다. disas shell로 shell함수의 주소를 알 수 있으니까 2021. 7. 26.
FTZ - level15 hint 14번과 비슷한데 다른 점은 check가 포인터 변수라는 것. if (*check == 0xdeadbeef) ☞ check에 담긴 주소가 가리키는 곳에 0xdeadbeef가 담겨있어야 한다. gdb에서 x/50x main 으로 0xdeadbeef의 주소를 알 수 있다. 그렇다면 check에 방금 구한 0xdeadbeef의 주소를 넣어서 익스플로잇하면 된다. 코드 영역은 주소가 항상 고정인가? ☞ PIE 보호기법이 적용되어있다면 코드 영역의 주소도 바뀐다. 하지만 ftz 문제는 그럴 리 없다.. 다른 풀이 jump to filename with symbolic link 심볼릭 링크란? 바로가기같은 느낌. ln -s [원본파일] [새로만들파일이름] 심볼링 링크를 어떻게 활용할 것인가? cat /pr.. 2021. 7. 24.
FTZ - level14 level 13은 이전과 풀이가 동일하기 때문에 생략했다. hint gdb로 까보면 fgets 주변에 [ebp-56]이 buf의 시작 주소이고, cmp 주변에 [ebp-16]이 check의 주소임을 알 수 있다. 따라서 40바이트는 아무 값이나 채우고, 마지막 4바이트(==check)에 0xdeadbeef를 넣으면 된다. 따라서 (python -c 'print "A"*40+"\xef\xbe\xad\xde"'; cat) | ../attackme my-pass 찍으면 답 나온다. 2021. 7. 23.
FTZ - level12 hint 여기서는 gets 함수로 사용자 입력을 받는다. gets 또한 입력값 길이를 검사하지 않는다는 취약점이 있다. 그럼 level11과는 printf에 %s가 추가되었다는 점, gets함수를 사용한다는 점만 다르다. 11번과 동일하게 풀면 된다. 다만, 다른 점은 여기서는 gets로 실행파일을 실행시키면 사용자 입력을 기다리므로 (python -c ~~; cat) | ./attackme 와 같이 실행해야 한다. 왼쪽 python 명령어의 결과로 쉘을 얻었지만, 더 이상 입력이 없어서 쉘이 실행되자마자 종료된 것이다. 이걸 해결하려면 파이프( | ) 앞의 프로그램이 끝나지 않고 입력을 기다려야 한다. 2021. 7. 22.