darkknight의 소스를 우선 확인하겠습니다.

코드가 확 짧아졌네요.

problem_child함수가 argv[1]을 받아와 버퍼에 입력 하는데 이상한점은 버퍼가 40byte인데 41byte를 입력하네요.

값을 입력할 때 1byte가 초가되어 SFP의 제일 마지막 1byte를 덮어 씌울것으로 보입니다.

 

이러한 취약점을 Frame Pointer Overflow라고 합니다.

 

스택에서 SFP위 주소에는 RET가 존재합니다.

SFP가 가르치는 메모리의 +4byte에 있는 값은 다음 명령어의 실행 주소가 됩니다.

 

이번 문제는 이를 이용하는 문제입니다.

problem_child에서 SFP의 마지막 1자리를 우리가 원하는 대로 변조할수 있다는건 EBP를 원하는데로 설정 할 수 있다는 뜻입니다.

만약 41번째에 0xa0을 입력하여 problem_childSFP0xbfffffa0이 들어가게 되면, problem_child함수가 끝나고 ebp0xbfffffa0가 되고, main함수가 끝날때 ebp+4의 값이 eip로 들어가니 0xbfffffa4의 값이 eip에 들어가게 됩니다.

 

그럼 문제는 해결 된듯 합니다.

problem_childebp만 구할수 있다면, 원하는 값을 다 넣을수 있죠.

 

gdb를 통해 problem_child ebp값을 알아보겠습니다.

problem_childebp값은 0xbffffabc입니다.


ebp-40부터 40byte데이터를 확인해 보도록 하겠습니다.

0xbffffab4부터 40byte A가 들어가있고 41번째에 B가 들어가 sfp0xbffffa42로 바꾸었습니다.

 

페이로드를 생각을 해보면 sfp0xbffffab0으로 수정하고 버퍼에는 eip + NOP슬라이드 + 쉘코드를 넣으면 될듯 합니다.

0xbffffab8(4byte) + NOP슬라이드(11byte) + 쉘코드(25byte) + \xb0

 

예상한대로 값을 넣도록 하겠습니다.

세그펄트가 떳네요.

 

core dump로 원인을 확인해 보겠습니다.

스택의 영역이 조금 밀렸네요.


SFP0xbffffac0으로 수정해주고 eip값을 0xbffffac8로 변경해 주도록 하겠습니다.

성공적으로 쉘이 획득되었습니다.

 

원본 파일을 대상으로 공격하도록 하겠습니다.

성공적으로 darkknight의 쉘이 획득되었습니다.

darkknight의 패스워드는 new attacker이네요.

+ Recent posts