level 12

2020. 9. 8. 13:57

 

이번에는 main 함수의 인자 개수가 두 개 이상이기만 하면 되고, 사용자정의 함수가 보이네요.

그리고 문제 상단에 보면 FPO라고 나와있습니다.

 

FPO란 Saved Frame Pointer Overwrite로 SPO라고도 불립니다. SFP를 이용해 BOF를 야기하는 것입니다.

이 기법에 관한 것은 따로 자세하게 글을 올릴 예정입니다.

 

먼저 파일을 복사합니다.

 

 

이제 디버깅을 합시다.

 

 

problem_child 함수의 내용을 봅니다.

FPO 공격에서 핵심은 에필로그로 leave와 ret을 잘봐야겠죠?

problem_child+41로 break pointer를 겁니다.

 

 

이제 인자로 A 40개를 줍니다.

 

 

성공적으로 도달했습니다.

이제 메모리 값을 살펴보겠습니다.

 

처음의 8바이트(0xbffffa8c~0xbffffa93)는 이전의 main 함수에서 problem_child를 호출하기 위해 stack에 push했던 값들입니다.

0xbffffa94의 값이 들어있는 것을 보니 problem_child 내의 buffer 변수의 시작주소를 나타내는 것 같고, 0x08048500은 problem_child 함수 시작 부분의 주소인것 같죠?

그리고 많은 "A"값들이 0x41로 저장되어있는 것이 보입니다.

0xbffffabc~0xbffffac3은 problem_child 스택프레임으로 SFP와 RET에 들어가는 데이터입니다.

0xbffffa00으로 $ebp값이 저장되고 leave에 의해 $ebp 값을 $esp에 복사한 뒤 POP을 하게 되어 $ebp는 해당 위치로 이동하고 $esp는 POP 연산에 의해 +4가 되네요.

소스코드를 잘보면 41글자를 입력할 수 있으니 딱 SFP의 1바이트를 담을 수 있을 크기입니다.

그러면 0xbffffabc의 '00' 부분을 덮게 될텐데, '00' 부분을 어떤 숫자로 채워야할까요?

바로 '8c'입니다.

왜냐하면 leave에 의해 POP이 실행될 때 현재의 4바이트를 버리고 다음 주소로 +4를해 이동하기 때문입니다.

RET를 통해 POP $eip를 하게 되고, JMP $eip를 통해 0xbffffa90의 값 즉, 0xbffffa94의 주소로 이동합니다.

이때, 0xbffffa94는 problem_child의 buffer 변수의 시작 주소로 여기에 쉘코드가 담겨있다면 쉘이 떨어지겠죠?

 

payload는 이렇습니다.

"\x90"*15 + "~~"(ShellCode) + "\x8c"

 

 

성공!

'[▒] 보안 > LOB' 카테고리의 다른 글

level 14  (0) 2020.09.08
level 13  (0) 2020.09.08
level 11  (0) 2020.09.08
level 10  (0) 2020.09.07
level 9  (0) 2020.09.06

BELATED ARTICLES

more