본문 바로가기

Wargame, CTF/protostar

heap2

소스코드

구조체 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된 메모리를 씀

 

heap2 실행

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번 써도됨

 

pass

service이후에 a가 16개만 들어갔지만

이후 널바이트도 들어갔기 때문에 클리어됨

 

service를 두번 할당하면 

두번째 service가 auth구조체의 auth의 위치에 오게 되면서

service의 heap 헤더에 type/size값이 

auth를 변조시켜 클리어

 

free를 사용하고는 비슷하게

service의 위치가 auth구조체의 위치를 사용해서

단순하게는

service를 3번 쓰면됨

 

auth를 free시키고 

service에 일정바이트 이상쓰게되면

기존 auth가 할당된 공간보다 크기 때문에

service는 auth가 있던 자리가 아닌 그 다음 위치에 할당되게됨

'Wargame, CTF > protostar' 카테고리의 다른 글

heap1  (0) 2020.02.27
heap0  (0) 2020.02.27
format4  (0) 2020.02.26
format3  (0) 2020.02.26
format2  (0) 2020.02.26