실제로 시스템의 어떤 부분이 책임이 있는지 알지 못하지만 왜 실패했는지 알 수 있습니다. .dtors
바이너리에서 쓰기 가능으로 표시되어 있지만 ( .ctors
GOT 및 기타 몇 가지 와 함께) 바이너리 에서 메모리에 별도의 쓰기 불가능한 페이지에 매핑되는 것처럼 보입니다 . 내 시스템 .dtors
에서 0x8049f14
다음을 수행 하고 있습니다 .
$ readelf -S test
[17] .ctors PROGBITS 08049f0c 000f0c 000008 00 WA 0 0 4
[18] .dtors PROGBITS 08049f14 000f14 000008 00 WA 0 0 4
[19] .jcr PROGBITS 08049f1c 000f1c 000004 00 WA 0 0 4
[20] .dynamic DYNAMIC 08049f20 000f20 0000d0 08 WA 6 0 4
[21] .got PROGBITS 08049ff0 000ff0 000004 04 WA 0 0 4
[22] .got.plt PROGBITS 08049ff4 000ff4 00001c 04 WA 0 0 4
[23] .data PROGBITS 0804a010 001010 000008 00 WA 0 0 4
[24] .bss NOBITS 0804a018 001018 000008 00 WA 0 0 4
실행 파일을 실행하고 확인 /proc/PID/maps
하면 다음이 표시됩니다.
08048000-08049000 r-xp 00000000 08:02 163678 /tmp/test
08049000-0804a000 r--p 00000000 08:02 163678 /tmp/test
0804a000-0804b000 rw-p 00001000 08:02 163678 /tmp/test
.data
/ .bss
여전히 자신의 페이지에 쓸 수 있지만 다른 페이지에는 쓸 0x8049000-0x804a000
수 없습니다. 나는 이것이 커널의 보안 기능이라고 가정한다. W ^ X ; Linux에는 PaX 가 있지만 대부분의 커널에는 내장되어 있지 않습니다)
mprotect
페이지의 메모리 내 속성을 변경할 수있는으로 해결할 수 있습니다 .
mprotect((void*)0x8049000, 4096, PROT_WRITE);
이로 인해 테스트 프로그램이 충돌하지 않지만 다른 함수의 주소로 .dtors
( 0x8049f18
) 의 끝 센티넬을 덮어 쓰려고 해도 해당 함수는 여전히 실행되지 않습니다. 그 부분은 알아낼 수 없습니다.
다른 사람이 페이지를 읽기 전용으로 만드는 책임이 무엇인지, 그리고 왜 수정 .dtors
이 내 시스템에서 아무런 영향을 미치지 않는지 알고 싶습니다.