
[FTZ] 해커스쿨 FTZ level 18
2021. 4. 13. 22:59
Wargame/Hackerschool FTZ
1. 문제 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(FD_SETSIZE, ..

[FTZ] 해커스쿨 FTZ level 17
2021. 4. 13. 19:03
Wargame/Hackerschool FTZ
1. 문제 앞의 16번 문제와 유사한 모습이다. 1. 입력 시 bof 가 발생함. 2. level 18로 권한을 상승함. 3. 함수 포인터를 통해 call() -> printit() 실행함. 다만, 여기선 쉘을 실행하는 부분이 없다. -> 우리가 직접 쉘을 실행시켜줘야 한다. 처음에 system 함수를 통해 "binsh" 실행시키고자 했으나, 바이트도 부족하고 해서 안되었다. 그래서 환경변수를 통해 쉘을 실행시키는 방법을 썼다. 2. 문제 해결 과정 환경 변수란? OS가 필요한 정보를 메모리에 등록해 놓고 필요할 때마다 참조하는 영역으로, 일반 사용자도 필요하다면 여기 등록해서 사용할 수 있다. 환경변수는 고정된 메모리 주소를 가진다는 장점이 있기에, 환경 변수에 쉘코드를 등록하고 그 환경 변수 주소를 ..

[FTZ] 해커스쿨 FTZ level 16
2021. 4. 13. 17:51
Wargame/Hackerschool FTZ
1. 문제 소스 코드를 간단하게 분석해보면 다음과 같다. 1. 입력 시 bof 발생 2. 함수 포인터를 통해 call() -> printit() 실행 3. shell 함수를 직접 실행하는 부분이 없음. 어떻게 shell 함수를 실행시킬 수 있을까? -> shell 함수를 실행하는 것이 문제의 목표임. 고민해보다가 다음의 아이디어가 떠올랐다. bof 를 통해 함수 포인터에 printit() 대신 shell() 을 넣어주면 그 뒤에 call이 실행되며 shell()을 실행할 것이다. 2. 문제 해결 과정 필요한 것들을 구해보자! 1. 함수 포인터의 위치 mov DWORD PTR [ebp-16], 0x8048500이 void (*call)() = printit 부분 같아서 printit 함수를 디스어셈블 해보..

[FTZ] 해커스쿨 FTZ level 15
2021. 4. 12. 22:30
Wargame/Hackerschool FTZ
1. 문제 앞선 14번 문제와 유사한 모습이다. 다만 여기선 check가 int형 포인터이다. bof를 통해 check 값( 주소 값을 변경해서 ), 그 주솟값을 참고했을 때 0xdeadbeef 가 되게 해야한다. -> 0xdeadbeef 의 주솟값을 구해서 check 값을 그것으로 변경해주면 될 것이다. 2. 문제 해결 과정 이제 그럼 구해야 할 것들 구해보자! check : ebp-16 buf : ebp -56 check 와 buf 간 offset은 40이다. 그리고 0xdeadbeef 의 경우 프로그램에 직접 코딩되어 있어 코드 영역에 존재한다. 그래서 0xdeadbeef 의 주소를 구해보자! 따라서 payload는 다음과 같을 것이다. "A"*40 + 0x80484b2 3. Exploit

[FTZ] 해커스쿨 FTZ level 14
2021. 4. 12. 22:18
Wargame/Hackerschool FTZ
1. 문제 역시나 bof 문제 같다. 오늘은 15번까지만 풀어야겠다...^^(힘듦) fgets를 통해 입력 받을 때 버퍼 크기인 20보다 더 많이 입력받아서 bof가 발생한다. bof를 통해 check 값을 0xdeadbeef 로 변경해주면 level 15의 권한으로 쉘이 실행될 것이다. 2. 문제 해결 과정 buf 와 check 간 offset을 구해보자! buf : ebp-56 check : ebp-16 buf 와 check offset : 40 따라서 payload는 다음과 같을 것이다. "A"*40 + 0xdeadbeef 3. Exploit

[FTZ] 해커스쿨 FTZ level 13
2021. 4. 12. 21:46
Wargame/Hackerschool FTZ
1. 문제 strcpy() 에서 입력값 검증을 하지 않아 buf 크기보다 더 입력을 받을 수 있어 bof 가 발생한다. 다만, buf 근처에 있는 i 변수를 통해 i 값이 변조되었을 경우 bof가 발생했음을 알리고 프로그램을 종료한다. 이때 어떻게 하면 쉘을 얻을 수 있을까? 앞에 11, 12번 문제와 유사한데 거기서 더해서 i 값만 유지해주면 bof를 일으켜도 괜찮을 것 같다. 2. 문제 해결 과정 이제 그럼 필요한 것들을 구해보도록 하자. 1. ret와 buf 사이의 offset 이때 esp는 ret를 가르키고 있다. strcpy 하기 전에 eax를 push 하기에 eax에 buf의 시작 주소가 들어있을 것이다. ret와 buf의 offset은 1052이다. 2. 변수 i 의 위치 i : ebp-12..

[FTZ] 해커스쿨 FTZ level 10
2021. 3. 26. 20:58
Wargame/Hackerschool FTZ
hint를 확인한 모습이다. 힌트에 따르면 공유 메모리를 사용하여 만든 프로그램을 도청하는 것이 문제 핵심입니다. 공유메모리란? 공유 메모리는 IPC(Inter-Process Communication)의 한 가지 방법으로 프로세스간 통신이 필요할 경우 사용합니다. 공유 메모리를 통한 통신은 둘 이상의 프로세스가 공통 메모리에 액세스 할 수 있는 개념으로 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있습니다. ipcs -m 명령어를 통해 공유 메모리 세그먼트에 대해 알 수 있습니다. key는 7530 byte이며, 크기는 1028 byte입니다. 이제 공유메모리에 접근해서 프로그램을 도청해봅시다. 공유 메모리를 사용하지 위해서는 아래의 헤더파일을 include 해주어야 합니다...

[FTZ] 해커스쿨 FTZ level 9
2021. 3. 26. 19:32
Wargame/Hackerschool FTZ
문제 힌트를 확인한 결과입니다. fgets 함수를 통해 buf에 입력을 받는데, buf의 크기인 10보다 큰 40 byte 만큼 입력을 받고 있습니다. 따라서 버퍼 오버플로우가 발생합니다. 이때 우리의 목표는 level 10의 권한으로 쉘을 실행시키는 것으로, buf2의 값이 "go"일 때 level 10의 권한으로 "/bin/bash"가 실행됩니다. 따라서 버퍼 오버플로우를 통해 buf2의 값을 "go"로 변경하면 될 것으로 보입니다. 그럼 이제 offset을 구하고 payload를 작성해보겠습니다. Offset 구하기 gdb를 이용해 디버깅을 해보겠습니다. 그런데 /usr/bin/bof 파일에 gdb를 실행시키니 permission denied가 뜹니다. 그래서 hint에서 주었던 소스 코드를 가지고..