chk_fail 함수의 주소와 get_shell 함수의 주소를 IDA에서 구했습니다.
이들의 값을 출력해봤을 때,get_shell은 IDA랑 같은데
chk_fail의 값은 IDA에서는 0x6010B0이고, 콘솔에 찍었을 땐 0x601020으로 나옵니다.
이 차이가 생기는 이유가 궁금하고,
이렇게 __stackk_chk_fail 이랑 앞에 막대기 하나 차이로 또 한 함수가 더 있었는데 이렇게 두 개가 있는 이유는 뭔가요? 이름 앞에 막대기 세 개인 함수는 에러가 떠서요!
안녕하세요! 얕은 지식이지만 아는 선에서 설명드리겠습니다.
문제를 확인해보았는데 보호기법이 Partial RELRO 으로 설정이 되어 있어서 got overwrite가 가능합니다.
Partial RELRO는 .got.plt 영역에 쓰기 권한이 존재하므로 해당 영역을 원하는 주소로 덮어써서 공격이 가능합니다.
먼저 질문자님이 작성하신 payload를 확인해보면 chkfail_addr = E.got["__stack_chk_fail"]의 주소를 출력하셨을 때 0x601020이 출력되고 IDA에서는 0x6010B0으로 차이점이 존재한다고 하셨는데, 당연히 다를 수 밖에 없습니다.
IDA를 확인해보면 __stack_chk_fail의 주소를 extern에서 확인하고 계시고 payload에서는 E.got, 즉 got의 주소를 출력하고 계시기 때문입니다.
즉 아래의 주소가 아니라
밑에 .got.plt의 주소를 확인하시면 0x601020으로 동일한 것을 확인할 수 있습니다.
추가적으로 ___stack_chk_fail에 관해서도 답변드리면 __stack_chk_fail이 왜 ___stack_chk_fail로 표현되는지는 잘 모르겠지만 IDA로 확인해보면 아래 사진과 같이 0x601020으로 점프하는것을 보면 문제 푸는데 지장은 없을 것 같습니다!