Pwnable/LOB

[LOB] 11. GOLEM

Lucvs 2020. 8. 28. 15:54

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