우선 제공된 소스를 살펴보도록 하겠다. 버퍼의 길이를 줄여 버퍼 자체에 쉘코드를 입력하는 방식의 공격을 막았다. 이를 피해 오버플로우를 일으킬 수 있는 방법으로는 1탄에서 해결했던 방법처럼 환경변수로 쉘코드를 등록한 후 환경변수의 메모리 주소를 RET에 덮어씌우는 것이다. 스택의 구조를 보면 이번에도 더미가 없는 것을 알 수 있다. 따라서 스택의 구조는 buf[16]+SFP[4]+RET이므로 RET의 위치까지 임의의 값을 입력하고 RET 값을 쉘코드를 등록한 환경변수의 주소로 덮어씌워주면 된다. 쉘코드의 주소는 0xbffffee3이므로 다음 값을 리틀 엔디안 형식으로 입력하면 된다.
1단계씩 몬스터를 쓰러트리면서 던전을 클리어 하는 TheLordOfBOF - BOF 원정대 워게임이다. 우선 문제에 대해서 확인해보자. strcpy 에서 문자열 길이에 대한 검증을 하지 않았으므로 버퍼 오버플로우를 일으킬 수 있는 기초적인 문제였다. 우선 gdb로 메모리 구성을 살펴보도록 하자. 스택의 메모리 확보량이 정확히 256으로 더미가 존재하지 않는다. 따라서 버퍼 오버플로우 공격을 해보도록 하겠다. 환경변수에 shellcode를 등록한 후 gremlin에 대하여 환경변수가 위치하는 메모리 주소를 알아보았다. 스택의 구조는 buf[256] + SFP[4] +RET로 구성되어 있으므로 260바이트를 다른 값으로 적은 다음 RET 주소를 쉘코드가 위치한 주소로 덮어씌워주면 된다. ./gremlin `..
level20이 마지막이다. 힌트를 확인해보도록 하자. fgets 함수를 사용하여 입력문자 제한을 두었다. 따라서 버퍼 오버플로우 공격은 힘들거라 예상할 수 있겠다. 하지만 printf 함수에서 서식문자를 사용하지 않고 바로 출력하였기 때문에 bleh 변수를 이용하여 포맷스트링 공격을 할 수 있을 것으로 예상이 된다. 서식문자를 사용하지 않고 직접 출력을 하게 된다면, 만약 bleh 변수에 서식문자를 입력하였을 경우 esp부터 요구되는 사이즈만큼 자동으로 참조를 하면서 메모리를 참조할 수 있게된다. %x는 4바이트씩 참조하기 때문에 4바이트 단위로 이동할 수 있는 수단이 된다. %n이라는 서식문자는 printf에서 출력된만큼 10진수로 저장하는 서식문자이다. 이 서식문자를 통해서 메모리에 RET주소를 쉘..