tcache key값 덮기
typedef struct tcache_entry {
	struct tcache_entry *next;
	/* This field exists to detect double frees.  */
	struct tcache_perthread_struct *key;
} tcache_entry;

64bit에서 key의 위치는 9번째 바이트부터인데, tcache poisoning 강의에서 8바이트를 덮어 키 값을 변조하라고 나와 있습니다. 또한 제가 익스플로잇을 짤 때도 dummy를 7바이트로 설정하면 공격이 실패했으나, 8바이트 이상으로 설정하면 공격이 성공했습니다. 다른 분이 작성하신 글에는 뒤에 널 바이트가 자동으로 삽입되어 9번째 바이트가 널로 바뀌기 때문에 변조가 가능한 것 같다고 나와 있습니다. 그런데 문제에서 주어진 c파일의 modify 부분의 코드를 보면 다음과 같습니다.

    printf("Data: ");
    read(0, ptr[idx], size);

이를 보고 혹시 read 함수가 데이터를 읽으면 뒤에 자동으로 널 문자를 저장해주는지 찾아봤는데, 그런 기능은 없는 것 같습니다. 혹시 왜 dummy를 8바이트로 설정해도 key값이 변조되는지 아시는 분 있을까요?

#heap #tcache #tcachekey #tcachepoisoning
작성자 정보
답변 2
gardenia
대표 업적 없음

글 수정이 안 돼서 여기에 질문을 추가합니다ㅠㅠ tcache poisoning 강의에서는 8바이트 뒤에 널바이트까지 추가하라고 되어 있네요! 그런데 dup2 문제에서는 modify(b'1', b'16', b'aaaaaaaa')으로 익스플로잇을 작성했을 때 공격이 성공했는데, 혹시 a로 채워지고 남은 뒷부분이 자동으로 널로 채워져서 key값이 변조된 건가요? modify(b'1', b'8', b'aaaaaaaa')로 시도하면 공격이 실패합니다.

2024.01.31. 18:01
avatar
mini_chip
워게임 고인물

이건 제 추측인데, 익스 코드를 작성하실 때 read에 관한 입력을 send로 보낸 것이 아니라 sendline으로 보낸 것이 아닌가 싶습니다. sendline으로 보내면 개행문자까지 같이 send합니다. 그렇기 때문에, modify(??, b"8", b"a"*8)에서는 b"a"*8+b"\n"까지 9byte를 send했지만 8byte로 입력 크기를 제한했기 때문에 개행 문자가 입력이 들어가지 않았던 것이고, modify(??, b"16", b"a"*8)에서는 b"a"*8 + b"\n"까지 모두 입력된 것으로 추측됩니다.

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