.text 段解析期间全局缓冲区溢出

问题描述 投票:0回答:1

鉴于所附代码以及与此问题“.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 崩溃。

android memory-management overflow elf address-sanitizer
1个回答
0
投票

.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错误以及哪个符号位于该地址。

© www.soinside.com 2019 - 2024. All rights reserved.