먼저 답변 감사드립니다.
IDA를 활용했습니다.
main 함수 부근에 call _printf라고 되어있고 여차여차 호출한 곳을 따라다 보면
extrn printf 라고 되어있는 곳에 다다르더군요
궁금한것은 위 코드로 libc.a의 printf 옵셋위치를 어떻게 알 수 있는가 입니다.
혹시 elf파일이 아닌 메모리 위로 올라간 상태를 덤프해서 보란 말씀이신가요?
gdb에서 확인해본 결과 45줄의 *804a008 에는 바로 다음줄인 0x80482f6 이 들어있더군요.
즉 132 >> 45 >> 46 >> 47 >> 29 >> 30 순으로 흐름이 이어집니다.
30번째 줄에서 libc.a의 printf로 진입하게 되는것인가요?
설령 맞다 하더라도 저 값이 어떻게 생성되었는지가 궁금합니다.
libc.a 에 printf 가 있다고 한다면 이 object code binary는 link 시에 실행파일에 포함됩니다.
link시에 printf는 relocation에 의해서 .text 영역에 특정 번지를 할당받게 되고 printf 함수를 호출하는 부분의 번지가 이 특정 번지 값으로 교체됩니다.
objdump 만 활용하셔도 이유는 아실 수
objdump 만 활용하셔도 이유는 아실 수 있습니다.
심볼을 유지합니다.
먼저 답변 감사드립니다. IDA를
먼저 답변 감사드립니다.
IDA를 활용했습니다.
main 함수 부근에 call _printf라고 되어있고 여차여차 호출한 곳을 따라다 보면
extrn printf 라고 되어있는 곳에 다다르더군요
궁금한것은 위 코드로 libc.a의 printf 옵셋위치를 어떻게 알 수 있는가 입니다.
혹시 elf파일이 아닌 메모리 위로 올라간 상태를 덤프해서 보란 말씀이신가요?
elf 파일을 보시면 됩니다. binutils의
elf 파일을 보시면 됩니다.
binutils의 objdump툴을 이용하세요
static link는 어차피 링커가 연결해 주는 거니 각각 다를 수 있고 dynamic link의 경우는 runtime 중 symbol을 통해서 연결합니다.
답변 감사합니다. 아래는 dump를 뜬 코드의 일부분
답변 감사합니다. 아래는 dump를 뜬 코드의 일부분 입니다.
아래 call 부분이 printf에 해당하는 부분이구요
call 이후 jmp를 수행하게 됩니다.
28 080482c0 <__gmon_start__@plt-0x10>:
29 80482c0: ff 35 f8 9f 04 08 pushl 0x8049ff8
30 80482c6: ff 25 fc 9f 04 08 jmp *0x8049ffc
...
44 080482f0 :
45 80482f0: ff 25 08 a0 04 08 jmp *0x804a008
46 80482f6: 68 10 00 00 00 push $0x10
47 80482fb: e9 c0 ff ff ff jmp 80482c0 <_init+0x30>
...
126 080483b4 :
...
132 80483c4: e8 27 ff ff ff call 80482f0
gdb에서 확인해본 결과 45줄의 *804a008 에는 바로 다음줄인 0x80482f6 이 들어있더군요.
즉 132 >> 45 >> 46 >> 47 >> 29 >> 30 순으로 흐름이 이어집니다.
30번째 줄에서 libc.a의 printf로 진입하게 되는것인가요?
설령 맞다 하더라도 저 값이 어떻게 생성되었는지가 궁금합니다.
libc.a에
libc.a 에 printf 가 있다고 한다면 이 object code binary는 link 시에 실행파일에 포함됩니다.
link시에 printf는 relocation에 의해서 .text 영역에 특정 번지를 할당받게 되고 printf 함수를 호출하는 부분의 번지가 이 특정 번지 값으로 교체됩니다.
...
저도 잘 모르지만 Procedure Linkage Table로 찾아보시면 아마 원하시는 내용이 나올 것 같습니다.
제 기억으로는 아래의 웹사이트가 소개하는 책에 자세한 설명이 있었던 것 같은데... 이거 하나 알아보려고 사기는 좀 그렇고, 가까운 데 도서관이 있으면 한번 찾아보세요.
http://csapp.cs.cmu.edu/
답변 감사합니다. plt와 got에 대하여 찾아
답변 감사합니다.
plt와 got에 대하여 찾아 완벽하진 않지만 어느정도 알게되었습니다.
궁금한게 또 생겨 다시 포스팅 했습니다.
댓글 달기