【发布时间】:2021-04-30 15:42:30
【问题描述】:
我已经为目标进程动态加载了一个共享库。目标进程有一个功能
void printNum()。是否可以在 shred 库中获取它的地址?
实际上我需要.text段的起始地址+函数偏移量,但是在目标进程中我可以用&printNum得到它,是否可以在共享库中做同样的事情?
【问题讨论】:
标签: c linux shared-libraries code-injection
我已经为目标进程动态加载了一个共享库。目标进程有一个功能
void printNum()。是否可以在 shred 库中获取它的地址?
实际上我需要.text段的起始地址+函数偏移量,但是在目标进程中我可以用&printNum得到它,是否可以在共享库中做同样的事情?
【问题讨论】:
标签: c linux shared-libraries code-injection
是否可以在 shred 库中获取地址?
也许吧。
如果主可执行文件导出其动态符号表中的符号,这很容易。如果是这样,您可以使用相同的&printNum 语法访问其地址。
要查看主可执行文件是否导出符号,请使用nm -D a.out | grep ' printNum'。
如果主可执行文件没有导出符号,并且您尝试使用&printNum 从foo.so 访问它,您的dlopen("foo.so", ...) 将失败并出现"printNum: unresolved symbol" 或类似错误。
如果您无法重建主可执行文件,例如-rdynamic flag,事情变得更棘手了。
如果主可执行文件有符号表(即它没有被剥离),该函数将在nm a.out 的输出中可见。您可以使用this code读取符号表,并从中获取printNum的地址。如果a.out 与位置无关,您还需要找到加载它的地址,例如使用dl_iterate_phdr().
如果主可执行文件没有符号表(即被剥离),则无法找到printNum 的实际位置,这种情况下的答案是“否”。
【讨论】: