passcode : cup of coffee
(NO DRAG, NO PASSCODE)
bash2 까먹지 말자. 소스코드부터 분석해 보자.
우선 이전의 문제들과는 다르게 main 함수에서 problem_child 함수를 호출한다. 또한 41bytes만큼을 입력받기 때문에 RET을 우리가 원하는 주소로 변조할 수 없다. 하지만 41bytes를 입력받을 수 있어서 SFP의 마지막 1byte를 변조시킬 수 있다. SFP의 마지막 1byte를 변조시켜 프로그램의 흐름을 뒤바꾸는 기법을 FPO라고 한다.
FPO 기법
- SFP 영역에서 1byte 변조(오버플로우)가 가능해야 함
- main 함수 외에 다른 sub 함수가 있어야 함
SFP의 마지막 1byte를 변조하면 코드의 흐름이 바뀌는 이유는 함수의 프롤로그와 에필로그를 이해하면 알 수 있다. FPO 기법을 사용하는 방법은 아래의 링크에서 볼 수 있다.
위의 두 내용을 이해했다면 이제 문제를 풀 차례이다. 우선 buffer의 시작 주소를 찾아보자.
buffer → 0xbffffbfc
이제 바로 payload를 짜보자. 여기서 SFP의 마지막 1byte를 buffer의 마지막 1byte("\xfc")에서 0x8을 빼준 값(0xbffffbfc - 0x8)로 변조시켜주면 된다.
core dumped 에러가 발생했다. core 파일을 분석해서 정확한 buffer의 주소를 구하자.
buffer → 0xbffffab4
따라서 buffer의 시작 주소에서 0x8을 빼준 값인 0xbffffaac 가 변조된 SFP가 된다면 main 함수의 에필로그 부분에서 다음과 같은 과정을 거치게 된다.
- pop ebp → esp = 0xbffffab0
- pop eip → esp = 0xbffffab4, eip = 0xbffffab0
이제 eip는 shellocde의 시작주소(0xbffffab4)가 들어있는 위치(0xbffffab0)에 존재하게 된다. 따라서 에필로그의 마지막 부분인 jump eip 명령어에서 0xbffffab4의 주소로 jump 하여 shellcode를 실행시키게 된다.
다시 payload를 짜서 쉘을 따보자.
[darkknight] : new atttacker
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 13. BUGBEAR (0) | 2020.08.28 |
---|---|
[LOB] 12. DARKKNIGHT (0) | 2020.08.28 |
[LOB] 10. SKELETON (0) | 2020.08.28 |
[LOB] 9. VAMPIRE (0) | 2020.08.28 |
[LOB] 8. TROLL (0) | 2020.08.28 |