blackbearwow 2022. 3. 3. 22:37

이번 문제는 굉장히 어려웠다...

stack smash protector 우회 문제이다.

스택 카나리 문제이므로 TLS접근하거나 스택 카나리 릭(함수의 프롤로그에서 저장된 카나리 값을 읽어낼 수 있으면 카나리 우회 가능)을 이용해 둘중 한가지 방법으로 푸는 문제인줄 알았다.

하지만 이 문제는 PLT와 GOT를 알고 푸는 문제이다.

PLT(Procedure Linkage Table): 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결 해주는 테이블.

GOT(Global Offset Table): PLT에서 호출하는 resolve()함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블.

 

소스 코드를 보면 addr를 입력받고 해당 addr주소에 value를 넣는다. 

에필로그 부분에 __stack_chk_fail이 있다. 

함수 내부에 들어가면 jmp cs:off_601020이 있다. 0x601020이 __stach_chk_fail함수의 got인것이다(아마도.. 정확히 이해한 것은 아니다)

그러므로 0x601020에 get_shell의 주소인 0x4008EA를 넣어주면 작동 할 것이다.