구조체 auth에 32바이트 name과 auth가 있음
실행 후에 fgets로 입력을 받고
'auth '면 auth이후에 값을
auth->name에 저장
'reset'이면 free(auth)
'service'면 service이후의 문자를 저장
'login'이면 auth->auth의 값이
0이아니면통과
0이면 불통
문제가 좀 애매함
UAF(Use After Free)취약점을 원하는 것 같은데
auth를 malloc할 때 auth구조체 만큼 동적할당 하는 것이 아니고
4바이트만 할당해서 딱히
free를 안해도 클리어 됨
일단 UAF는
동적할당을 한뒤에 free()를 하면 메모리에서 사라지는 것이 아님
free를 하고 같은 크기의 동적할당을 하면 free된 메모리를 씀
auth 1234로
구조체를 동적할당으로 0x804c818에 할당
service1234로 service를 0x804c828에 할당
하지만 auth를 reset으로 free시키고 service를 할당시키면 달라짐
auth를 free시키고 service를 할당시키니
auth의 자리에 service가 할당됨
auth구조체가 힙에 할당하고
free하지 않고 service를 할당하면
이 그림처럼 되는거같음
그래서 UAF를 안쓰고 하자면
auth를 할당하고
service를 할당하면서 16바이트를 쓰고
1바이트를 더써서 auth를 변조시키면됨
아니면 service를 2번 써도됨
service이후에 a가 16개만 들어갔지만
이후 널바이트도 들어갔기 때문에 클리어됨
service를 두번 할당하면
두번째 service가 auth구조체의 auth의 위치에 오게 되면서
service의 heap 헤더에 type/size값이
auth를 변조시켜 클리어
free를 사용하고는 비슷하게
service의 위치가 auth구조체의 위치를 사용해서
단순하게는
service를 3번 쓰면됨
auth를 free시키고
service에 일정바이트 이상쓰게되면
기존 auth가 할당된 공간보다 크기 때문에
service는 auth가 있던 자리가 아닌 그 다음 위치에 할당되게됨