[FTZ] 해커스쿨 FTZ level 19
2021. 4. 13. 23:31
Wargame/Hackerschool FTZ
1. 문제 소스코드가 상당히 심플하다. gets() 를 통해 입력을 받고, printf() 를 통해 입력 받은 것을 출력한다. 그런데 gets 를 통해서 입력을 받을 때, 입력값 검증을 하지 않기에 bof 가 발생한다. 따라서 ret를 변경해주면 될 것 같다. 1. 환경 변수에 등록한 걸 이용 2. nop을 줘서 풀어도 될 듯함. 이번엔 환경 변수를 이용해 풀어보겠다. 이때, 코드에 권한을 상승하는 부분이 없기에 setruid 함수를 포함하는 41byte shellcode 를 환경변수에 등록해줘야한다. 2. 문제 해결 과정 환경 변수를 등록할 때 앞에 nop을 적당히 주는 것을 추천한다! 처음에 nop 을 주지 않았는데, 쉘이 잘 따지지 않았다. 컴파일 한 후 실행하면 환경 변수의 주소가 출력된다. 페이..
[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 12
2021. 4. 12. 21:12
Wargame/Hackerschool FTZ
1. 문제 gets 함수를 통해 입력을 받는데, 입력값 검증을 하지 않아 버퍼 크기보다 더 많이 받을 수 있고, 따라서 bof가 발생한다. 아마 이번에도 aslr이 적용되서 주소들이 계속 바껴 nop을 줘서 풀면 될 것 같다. 2. 문제 해결 과정 그럼 버퍼와 ret 간의 offset과 버퍼의 시작 주소를 구해보도록 하자. 이때의 esp는 ret를 가르킨다. gets 함수 호출 전에 eax를 push 하므로, eax에 buf의 시작주소가 들어있을 것이다. 버퍼와 ret 간의 offset은 268이다. 버퍼의 시작 주소 + 0x500 = 0xbffff0d0 payload는 11번과 유사하다. ret 전까지를 dummy 값으로 채우고 뒤에 쉘코드를 넣고 쉘 코드 앞에 0x1000 만큼 nop을 준다. 그리고..