2017-12-04 4 views
1

주어진 파이썬이 주어진 바이너리에서 주어진 프레임이 실행되는지 알아보기 위해 파이썬 확장을 사용하려고합니다. 구체적으로 :함수를 포함하는 바이너리 찾기.

루비 스택 추적을보고 있는데, 프레임이 루비/libruby 또는 다른 바이너리에서 온 것인지 자동으로 알리고 싶습니다. 이에 대한 주요 기준은 프레임의 pcruby_exec_node과 동일한 soname에 속하는 지 여부입니다.

이것은 GDB 자체 행할 : 두 기호 /host/ruby-2.3.3에서 온 것을 볼 수 있습니다

#69 0x00007fe00444e783 in invoke_block (...) at vm.c:921 
921 in vm.c 
(gdb) info symbol 0x00007fe00444e783 
invoke_block.isra + 387 in section .text of /host/ruby-2.3.3 
(gdb) info symbol ruby_exec_node 
ruby_exec_node in section .text of /host/ruby-2.3.3 

. 파이썬은 gdb.solib_name를 통해이 액세스 할 수 있어야합니다 같은 문서에서

, 그것은 보이는,하지만 난 이것을 얻을 수 없습니다

ruby_exec_node = gdb.lookup_global_symbol('ruby_exec_node') 
ruby_solib = gdb.solib_name(ruby_exec_node.value().address) 
print(ruby_solib) 

나에게 None을 제공합니다. 그 밖의 다른 방법으로 기호에서이 정보를 얻을 수 있습니까?

두 번째 부분은 pc 주소에서 동일한 정보를 얻고 있습니다. 나는 주소를 얻기 위해 다음을 수행 할 수

gdb.selected_frame().pc() 

하지만 어떻게 info symbol ... 유사가에 해당하는 기호를 찾을 수 있습니까? 그 2 문제

답변

0

솔루션은 다음과 같습니다

는 오브젝트 파일에 기호에서가는 (반드시 경로를 - objfile 비교 될 수있다) :

ruby_exec_node = gdb.lookup_global_symbol('ruby_exec_node') 
ruby_file = ruby_exec_node.symtab.objfile 

그리고 현재의 objfile를 찾고 프레임 (current) :

sal = current.find_sal() 
if not sal.symtab: 
    # skip frame - doesn't contain symtab 

if sal.symtab.objfile == ruby_file: 
    # this frame executes code from the ruby binary