해커스쿨 문제를 푸는 중 가장 마음에 들면서도 감명받은 문제.
FPO의 개념을 여기서 처음 알았고, 가장 처음 공부할 때 혼자 어떻게 공격할지 엄청 고민하면서 며칠을 보냈고
결국 이해하면서 큰 전율을 느꼈었다.
BoB 면접 때도 이걸로 발표했을 만큼 꽤 좋아하는 공격 방식이다.
이 문제에서는 problem_child라는 다른 함수가 이미 존재하고, 그 안의 버퍼를 넘치게 하는 방식이므로 어려울 것도 없다.
흔히 말하는 1바이트 오버플로우 문제인데, 더미가 없는 관계로 저부분은 바로 SFP이다.
SFP 1바이트를 덮어쓸 수 있고, main 외의 다른 함수 내의 버퍼를 오버플로우 할 수 있다는 말은 FPO의 위험을 가지고 있다는 것이다.
해당 함수의 에필로그 + 메인 함수의 에필로그로 총 두 번의 leave와 ret이 일어나기 때문에 SFP의 변조는 곧 EIP의 변조로 이어질 수 있다.
환경변수에 쉘코드를 올리고 해당 주소를 구한 후 EIP에 들어갈 값인 BUF의 첫 4바이트를 해당 쉘코드의 주소로 주었다.
그리고 마지막 1바이트를 오버플로우 할 때 BUF주소의 -4바이트를 준다.
이 이유는 leave-ret이 한 번 일어나면서 EBP가 변조된 EBP로 이동된 후, 한번 더 leave-ret을 할 때 leave에서 pop ebp를 진행해 버리기 때문에 ret에서 pop을 할 경우 BUF의 첫 4바이트를 참조하게 하기 위함이다.
따라서 마지막 1바이트에서 BUF 주소를 그대로 집어넣으면 BUF의 처음에 4바이트 더미를 주고 쉘코드의 주소를 넣어야 한다.
간단하게 주소를 찾고 공격에 성공하였다.
'Wargame > Lord of Buffer overflow' 카테고리의 다른 글
LOB Redhat : bugbear > giant (0) | 2015.11.03 |
---|---|
LOB Redhat : darkknight > bugbear (0) | 2015.11.02 |
LOB Redhat : skeleton > golem (0) | 2015.10.15 |
LOB Redhat : vampire > skeleton (0) | 2015.10.15 |
LOB Redhat : troll > vampire (0) | 2015.10.15 |