PLT_example4 의 코드와 Build
main 함수 disassemble 결과
<main+42>에 위치한<puts@plt>
확인 가능
0x08048485(<puts@plt>
call 부분)에 break point 설정 후 실행
<puts@plt+0>
에서는 0x804a00c 메모리를 참조하여 저장되어 있는 값으로 점프. 해당 메모리에는<puts@plt+6>
의 주소가 저장되어 있음.<puts@plt+6>
에서는 스택에 0을 push한 후 0x8048310 함수로 점프.
이후 0x804a008 주소에 저장된 0xf7fee000 함수로 점프.
링커 라이브러리인 ld-linux.so.2 메모리에 있는 0xf7fee000 함수가 리턴하는 시점에 브레이크 포인트를 설정해 스택 메모리를 확인해보면 puts 함수로 점프하는 것을 보아, 0xf7fee000 함수는 호출된 라이브러리 함수의 주소를 알아내는 함수임을 알 수 있음.
리턴 주소를 puts@plt+6(0x8048326)으로 바꾸고, 첫 번째 인자를 “ASLR!” 문자열의 주소인 0x8048553으로 바꾸면 puts 함수고 실행되어 “ASLR!” 문자열이 출력된 것을 확인 가능. 하지만 puts 함수가 실행된 후 리턴할 주소가 0x42424242이기 때문에 Segmentation fault 발생.
main 함수에 break point를 설정하고 실행한 후 puts 함수의 GOT인 0x804a00c 메모리 값을 0xdeadbeef로 바꾸면 puts가 호출될 때 puts@got에 저장된 값으로 점프해 eip 레지스터의 값이 0xdeadbeef로 바뀜.