해커스쿨 F.T.Z Level 13
level 13 로그인 후 hint를 본다.
level 11, level 12와 비슷하다. BOF에 취약한 strcpy 함수가 있다.
hint를 분석하면 위와 같다.
strcpy는 복사할 때 크기를 검사하지 않기 때문에 BOF에 취약하다.
이제 BOF를 일으켜야 하는데 level 11과 level 12와 다른 점은 변수 i로 BOF가 일어나는지 확인하는 보안코드라고 볼 수 있다.
하지만 너무 단순한 보안코드이다.
gdb로 attackme를 분석해 프로그램이 어떻게 돌아가는지 본다.
처음 0x418(1048)byte만큼 공간을 확보하고 ebp-12에 0x1234567을 저장한다.
확보한 공간보다 -12에 변수 i를 저장한다고 생각하면 쉽다.
그렇다면 1036byte 이후에 변수 i가 저장된다.
변수 i가 어디에 저장되는지 알았다면 공격할 때 i를 포함해서 공격하면 된다.
공격을 위해 eggshell로 주소를 알아낸다.

주소를 알아냈으면 공격을 하면 되는데 간단하게 도식화하면 이렇게 된다.
1048byte | str | i | dummy | |
1036byte | 4byte | 8byte | ||
1024보다 넘게 저장해 BOF를 일으킴 | 0x1234567 저장 | 쓰레깃값 | ||
SFP (4byte) 여기까지 BOF를 일으켜야 한다. |
||||
RET (4byte) 그러면 여기에 쉘 코드가 입력된다. |

공격 코드를 보자면 "A"를 1036byte 주고 "i"를 저장해주고 "A"를 12byte를 넣고 환경변수 주소를 넣어준다.
여기서 두 번째 "A"에 12가 들어가는 이유는 dummy 공간 8byte와 SFP 4byte를 합쳐 12byte가 들어간다.