鉴于所附代码以及与此问题“.text 节解析期间的全局缓冲区溢出”相关的代码,我想知道是否可以修改此代码以仅解析内存中的 .text 节(可执行代码)以避免ASAN 的全局缓冲区溢出。
extern char __ehdr_start;
extern char etext;
ElfW(Ehdr) *elfhdr = (ElfW(Ehdr) *) &__ehdr_start;
int i;
for (i = 3; (unsigned long)(&__ehdr_start + elfhdr->e_entry + i) < (unsigned long)(&etext); i = i + 4) {
if ((unsigned char)*(&__ehdr_start + elfhdr->e_entry + i) == 0x01 ) {
if(((unsigned char)*(&__ehdr_start + elfhdr->e_entry + i - 1) == 0x02) && ((unsigned char)*(&__ehdr_start + elfhdr->e_entry + i - 2) == 0x03) && ((unsigned char)*(&__ehdr_start + elfhdr->e_entry + i - 3) == 0x04)) {
....
解析 Android 应用程序本机代码的 .text 部分,不会因全局缓冲区溢出而导致 ASAN 崩溃。
.text 段解析期间全局缓冲区溢出
在你的另一个问题中,你正在解析
.text
segment。在这个问题中,您正在尝试解析 .text
section。您的问题标题已互换。
您修改后的代码实际上并未解析
.text
部分。它通常从 _start
符号开始扫描,并在到达 etext
符号时停止。
这里有两个假设:
_start
符号位于 .text
部分的开头并且 _start
和etext
之间的所有内容都来自.text
部分这些假设都不能保证为真,尽管通常它们是在 Linux 上。我不知道典型的 Android 二进制布局是什么。
您应该能够运行
nm --numeric-sort a.out
并查看 _start
和 etext
之间的所有符号。如果它们中的任何一个位于 {C,D,G,R,S,V}
集合(或小写的同一集合)中,则违反了第二个假设。
如果所有符号都是
T
、t
、W
或 w
,则可能发生了其他情况。但是您应该能够告诉发生了什么,因为您知道_start
和etext
之间的哪个地址正在触发AddressSanitizer错误以及哪个符号位于该地址。