이해가안됩니당!

우선 제가 아는대로 설명드리자면
got 를 overwrite 해서 get_shell 함수를 실행하게끔 만들어야함.
buf 입력으로 카나리를 변조시켜 __stack_chk_fail 함수를 실행시킴.
__stack_chk_fail 함수의 got 를 get_shell 함수주소로 overwrite함.

여기서 궁금한게 있습니다.
풀이를 봤는데 addr에 __stack_chk_fail 함수 got 주소를 넣고
value에 get_shell 함수 주소를 넣더라구요.
addr, value 에 저렇게 값을 넣는다고 __stack_chk_fail 함수 실행하고 got가 value 값을 참조해서 get_shell 함수를 실행하게 되는부분이
이해가 안되네요..

#pwnable
작성자 정보
답변 1
avatar
Sechack
CTF First Place
int main(int argc, char *argv[]) {
    long addr;
    long value;
    char buf[0x40] = {};

    initialize();


    read(0, buf, 0x80);

    printf("Addr : ");
    scanf("%ld", &addr);
    printf("Value : ");
    scanf("%ld", &value);

    *(long *)addr = value;

    return 0;
}

C소스코드를 보시면 addr변수의 값을 long형 포인터로 형변환 한 다음에 역참조를 해서 value값을 할당하고 있습니다. 즉 addr변수의 값이 메모리 주소가 되고 value값이 해당 주소에 들어갈 값이 되면서 arbitiary write(임의 주소 쓰기)가 발생하게 되는겁니다. 원하는 주소를 원하는 값으로 덮을 수 있으므로 __stack_chk_fail함수의 got를 overwrite하게 되면 카나리를 변조했을때 해당 함수가 호출되므로 우리가 overwrite한 get_shell함수가 실행되는 것입니다. PLT, GOT에 대해서 잘 모르시는 거면 ROP공격 기법과 Lazy Binding에 대해서 공부하신 후에 다시 보시면 이해가 되실겁니다.

2022.05.19. 15:16
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기