level14로 로그인한 후 hint 파일을 확인해보면 마찬가지로 attackme의 소스코드가 나온다. 딱 봐도 char형 배열인 buf의 크기가 20이지만 fgets 함수로 45byte만큼 입력을 받기 때문에 stack buffer overflow가 일어난다.
fgets 아랫줄에서 check 변수의 값이 0xdeadbeef라면 쉘을 얻게 해 주는데, check 변수의 값은 0xdeadbeef가 아니므로 정상적인 입력으로는 쉘을 얻을 수 없다. 하지만 fgets 함수를 통해 buf에서 bof가 일어나므로 check의 값을 변조해 0xdeadbeef로 만들어 쉘을 얻을 수 있다.
일단 문제 파일은 디버깅이 불가능하므로 소스 코드를 복사해서 tmp 폴더에 파일을 빌드하고 gdb로 열었다.
fgets 함수 호출 부분, check와 0xdeadbeef를 비교하는 부분에 bp를 걸고 스택을 확인한다면 각각의 주소를 알 수 있다.
buf : 0xbffff130
check : 0xbffff158
구한 주소를 통해 buf와 check의 거리가 40byte라는 것을 알 수 있다.
따라서 payload는 40byte의 더미 값과 "\xef\xeb\xad\xde"로 구성하면 된다.
payload 뒤에 ;cat을 추가해줌으로써 프로그램이 shell 명령어를 입력하기 전에 종료되지 않도록 했다.
'Wargame > FTZ' 카테고리의 다른 글
[FTZ] level 16 (0) | 2021.06.06 |
---|---|
[FTZ] level 15 (0) | 2021.06.06 |
[FTZ] level 13 (0) | 2021.06.04 |
[FTZ] Level 12 (0) | 2021.05.29 |
[FTZ] Level 11 (0) | 2021.05.28 |