WARGAME
-
Lord of BOF - Challenge [2번] Gremlin -> CoboltWARGAME/LORD OF BOF 2018. 6. 20. 15:57
[Summary]1. 14행의 취약한 strcpy 함수를 이용하여 16 바이트의 buffer 배열에 16바이트 이상의 값을 입력함으로써 EIP 레지스터를 덮어씌울 수 있다.2. buffer 배열에 dummy(20) 값과 system 함수의 주소, dummy(4), system 함수의 인자(/bin/sh)를 입력시킨 후 EIP 레지스터를 buffer 배열의 system 함수 부분의 주소로 변조하여 system 함수를 실행시킨다.3. 프로그램 실행 권한의 쉘을 획득하여 flag를 획득한다.[Sourcecode]/* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) {..
-
Lord of BOF - Challenge [1번] Gate -> GremlinWARGAME/LORD OF BOF 2018. 6. 20. 00:01
[Summary]1. 14행의 취약한 strcpy 함수를 이용하여 256 바이트의 buffer 배열에 256바이트 이상의 값을 입력함으로써 EIP 레지스터를 덮어씌울 수 있다. 2. buffer 배열에 dummy(260) 값과 system 함수의 주소, dummy(4), system 함수의 인자(/bin/sh)를 입력시킨 후 EIP 레지스터를 buffer 배열의 system 함수 부분의 주소로 변조하여 system 함수를 실행시킨다. 3. 프로그램 실행 권한의 쉘을 획득하여 flag를 획득한다.[Sourcecode]/* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF */ int main(int argc, char *argv[..
-
LEVEL 17WARGAME/FTZ 2018. 5. 7. 18:40
level17 FTZ LEVEL17 [Summary] 소스코드의 11 행에서 fgets 함수를 통해 44(40+4) 바이트 만큼 버퍼를 복사한다. 소스코드의 9 행에서 call 함수 포인터 변수에 printit 함수의 주소를 넣기 때문에 buf 배열 이상의 데이터를 덮어 씌울수 있다. 소스코드의 13 행에서 call 함수 포인터를 호출하기 전 fgets 함수를 통해 call 함수 포인터 변수가 가리키는 printit 함수 주소가 아니라 shell 코드가 위치한 환경변수의 주소로 변조함으로써 level18(3098) 권한의 쉘을 획득하였다. [Sourcecode] 1. #include 2. 3. void printit() { 4. printf("Hello there!\n"); 5. } 6. 7. main(..
-
LEVEL 16WARGAME/FTZ 2018. 5. 6. 21:21
level16 FTZ LEVEL16 [Summary] 소스코드의 16 행에서 fgets 함수를 통해 44(40+4) 바이트 만큼 버퍼를 복사한다. 소스코드의 14 행에서 call 함수 포인터 변수에 printit 함수의 주소를 넣기 때문에 buf 배열 이상의 데이터를 덮어 씌울수 있다. 소스코드의 17 행에서 call 함수 포인터를 호출하기 전 fgets 함수를 통해 call 함수 포인터 변수가 가리키는 printit 함수 주소가 아니라 shell 함수의 주소로 변조함으로써 level17(3097) 권한의 쉘을 획득하였다. [Sourcecode] 1. #include 2. 3. void shell() { 4. setreuid(3097,3097); 5. system("/bin/sh"); 6. } 7. 8...
-
LEVEL 15WARGAME/FTZ 2018. 5. 5. 00:57
level15 FTZ LEVEL15 [Summary] 소스코드의 7 행에서 fgets 함수를 통해 44(40+4) 바이트 만큼 버퍼를 복사한다. 소스코드의 14~18 행에서 check 포인터 변수의 값이 0xdeadbeef 이면 setreuid 함수와 system 함수를 통해 level16(3096) 권한의 쉘을 획득할 수 있다. check 포인터 변수 앞까지 Dummy 데이터 (40)로 덮고 check 포인터 변수의 값을 0xdeadbeef 가 위치한 환경변수로 변조함으로써 level16(3096) 권한의 쉘을 획득하였다. [Sourcecode] 1. #include 2. 3. main() 4. { int crap; 5. int * check; 6. char buf[20]; 7. fgets(buf,45..
-
LEVEL 14WARGAME/FTZ 2018. 4. 29. 16:31
level14 FTZ LEVEL14 [Summary] 소스코드의 13 행에서 fgets 함수를 통해 Max 15바이트 만큼 버퍼를 복사한다. 소스코드의 14~18 행에서 check 변수의 값이 0xdeadbeef 이면 setreuid 함수와 system 함수를 통해 level15(3095) 권한의 쉘을 획득할 수 있다. buf 배열의 길이 (20 + 20)바이트만큼 덮고 check 변수의 값을 0xdeadbeef 로 변조함으로써 level15(3095) 권한의 쉘을 획득하였다. [Sourcecode] 1. // 레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다. 2. // 버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이 3. // 최고의 효과를 가져다줍니다. 4. 5. 6. #in..
-
LEVEL 13WARGAME/FTZ 2018. 4. 27. 16:13
level13 FTZ LEVEL13 [Summary] 소스코드의 10 행에서 strcpy 함수를 사용하므로 길이체크를 하지않아 Buffer Overflow 취약점이 발생한다. 소스코드의 12 행에서 메모리보호기법 중 canary 역할을하는 i 변수의 값이 변조되면 종료되어 버리기 때문에 i 변수의 값이 변조되지 않은것처럼 그대로 덮어준다. buf 배열의 길이가 (1024 + 12) 이며 canary 변수 i의 길이(4 + 8) 와 sfp 사이즈(4바이트)를 더한 1052바이트를 payload 로 전송하게되면 RET 값을 변조할 수 있다. aslr 보호기법으로 인해 buf 배열에 shellcode 를 삽입할 수 없어서 환경변수에 삽입하고 RET 를 쉘코드가 포함된 환경변수의 주소로 변조함으로써 결론적으로 ..
-
LEVEL 12WARGAME/FTZ 2018. 4. 26. 15:26
level12 FTZ LEVEL12 [Summary] 소스코드의 11 행에서 gets 함수를 사용하므로 길이체크를 하지않아 Buffer Overflow 취약점이 발생한다. str 배열의 길이가 (256 + 8) 이며 sfp 사이즈(4바이트)를 더한 268바이트를 payload 로 전송하게되면 RET 값을 변조할 수 있다. aslr 보호기법으로 인해 str 배열에 shellcode 를 삽입할 수 없어서 환경변수에 삽입하고 RET 주소에 쉘코드가 포함된 환경변수의 주소로 변조함으로써 결론적으로 프로그램의 흐름을 제어하고 level13(3093) 권한의 쉘을 획득하였다. [Sourcecode] 1. #include 2. #include 3. #include 4. 5. int main( void ) 6. { 7..