FTZ 14레벨입니다.

문제가 뭔가 이상해졌군요...

crap check buf를 선언하고, fgets을 통해 받아온 뒤 check가 0xdeadbeef라면 쉘을 실행한다네요.

fgets의 문자열 길이를 검사하지 않는 취약점을 이용해서 버퍼 오버플로우를 일으키라는 것 같습니다.

힌트에서 포멧스트링또한 학습한다는데... 그건 나중의 문제인것 같네요 ㅎㅅㅎ

 

암튼 gdb로 확인을 해줍시다.

 

cp 명령어를 통해 tmp 폴더로 이동시켜주고 gdb attackme 실행시켜줍니다.

 

intel 방식으로 안바꿨는데... 지금까진 별 문제 없었는데 이제 조금씩 어려워지네요...

AT&T 방식은 어려우니 Intel 방식으로 바꿔줍시다.

set disassembly-flavor intel

이렇게 입력해주고 다시 보면?

 

짠!

 

좀 더 알아보기 편해졌습니다.

 

이제 분석을 진행해봅시다~

먼저 0x38만큼 메모리 할당하고 또 0x04만큼 할당합니다.

0x38은 56이기 때문에 총 60만큼 할당한 것이네요 ㅎㅎ

 

더이상 뭐 빼고 한것이 없기 때문에 메모리 할당은 이정도만 보고 밑으로 내려오면?

 

여기가 아주 중요한 부분입니다.

ebp-56 위치의 주소값을 eax에 담고 이를 push한다는 거죠.

push를 한 것은 call 할때의 인자로 들어가므로 fgets의 인자로 ebp-56이 들어가게 됩니다.

 

이게 어떤 의미인지 대충 알겠죠? ebp-56부터 데이터가 입력된다는거죠.

프로그램을 실행할 때 fgets를 통해 입력받는데, 그 입력값이 저 부분부터 입력이 된다는거에요.

 

그리고 다음을 보면?

 

이 부분이 바로 코드에서 if 구문입니다. 만약 ebp-16의 부분이 0xdeadbeef라면 이라는 것이죠.

 

이제 우리는 문제를 다 풀었습니다!

 

ebp-56부터 입력받는데, ebp-16에서 비교를 한답니다!

그러면?

 

fgets 부분에서 40바이트를 채우고 0xdeadbeef를 채우면? 된다는거죠!

 

따란

 

성공했습니다!

fgets로 받기 때문에 저렇게 파이프라인을 통해 실행해야한다는거! 아시죠?

 

끄읕!

+ Recent posts