level14로 로그인한 후 hint 파일을 확인해보면 마찬가지로 attackme의 소스코드가 나온다. 딱 봐도 char형 배열인 buf의 크기가 20이지만 fgets 함수로 45byte만큼 입력을 받기 때문에 stack buffer overflow가 일어난다. fgets 아랫줄에서 check 변수의 값이 0xdeadbeef라면 쉘을 얻게 해 주는데, check 변수의 값은 0xdeadbeef가 아니므로 정상적인 입력으로는 쉘을 얻을 수 없다. 하지만 fgets 함수를 통해 buf에서 bof가 일어나므로 check의 값을 변조해 0xdeadbeef로 만들어 쉘을 얻을 수 있다. 일단 문제 파일은 디버깅이 불가능하므로 소스 코드를 복사해서 tmp 폴더에 파일을 빌드하고 gdb로 열었다. fgets 함수 호..
분류 전체보기
level13으로 로그인 후 hint 파일을 확인해보면 마찬가지로 소스코드가 주어진다. 확인해보면 인자 값을 1024 크기의 char형 배열 buf로 strcpy 함수를 이용해 복사하는데, 문제는 strcpy 함수가 bof에 취약한 함수라는 것이다. 이를 통해 stack buffer overflow를 일으켜 ret를 쉘 코드의 스택 위치나 환경 변수의 주소로 변조한다면 쉘을 얻을 수 있을 것이다. 하지만 문제는 ssp 보호기법의 canary와 비슷한 로직이 존재하다는 것이다. i에 0x1234567을 넣고 마지막 함수를 끝내기전에 i의 값이 그대로인지 검사하는데, 만약 bof를 일으켜 더미 값을 채워 ret를 조작하려 시도한다면, buf와 ret 사이에 있는 i를 변조하게 돼 canary 검증 로직을 통..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
이번에 작성할 문제는 Baby write-only password manager로 현재 참가하고 있는 Pwn2Win CTF의 pwn 카테고리에 있는 문제다. 한 문제라도 풀어보려고 노력했지만 대회 자체가 수준이 좀 높아.. 결국 풀지 못했다. 따라서 접근 방법이라도 정리해보려 한다. 일단 처음부터 실수를 했다. 솔브 수가 높은 다른 pwn 문제들은 nc 서버가 주어져 있지 않았는데(pwn 문제인데 web 서버가 등장했다..), 해당 문제는 nc 서버가 있어 너무 기쁜 나머지 문제 파일은 보지도 않고 무작정 서버에 접속해보며 삽질을 시작했다. 서버에 접속하면 "Hello there. Send me your ELF."라는 문구가 나온다. ELF 파일을 전송하라는 뜻이다. ELF 전송 방법에 대해서는 다음 줄..
level11과 비슷하게 로그인 후 ls 명령어를 통해 파일 들을 확인해보면 setuid가 걸린 파일 attackme와 hint가 존재하는 것을 알 수 있다. hint에는 attackme의 소스코드가 들어있다. 딱 봐도 알 수 있듯이 bof에 취약한 함수 gets를 쓴다. 입력을 받는 변수는 256byte 크기의 char형 배열 str이지만 gets 함수는 입력 값의 길이를 제한해주지 않기 때문에 256byte 넘는 입력 값을 준다면 stack bufferoverflow가 발생할 것이다. 마찬가지로 쉘을 얻게 해주는 함수가 없으므로 환경 변수에 쉘 코드를 넣고 ret를 해당 환경 변수로 overwrite하는 방법으로 exploit하면 될 것 같다. ret와 str 배열의 거리를 확인하기 위해 hint에 ..
level 10에서 얻은 패스워드로 로그인한다면 setuid가 걸려있는 attackme 파일과 hint 파일을 볼 수 있다. hint 파일을 확인해보면 bof에 취약한 strcpy를 통해 인자 값을 str 변수에 복사하는데, 이 str 변수는 256 크기다. strcpy 함수를 사용하기 때문에 bof 공격을 하면 될 것 같고, 쉘을 얻게 해주는 함수가 따로 없으므로 shellcode를 이용하면 되겠다. 일단 bof 공격이 통하는지를 확인하기 위해 인자로 더미 값을 256byte 넘게 주었다. 그러니 Segmentation fault가 발생한 것을 알 수 있다. bof 공격이 맞는 것 같다. 권한 문제 때문에 attackme 파일은 gdb로 디버깅 할 수 없으므로 tmp 폴더에 소스 코드를 이용해 똑같은 ..