首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法为Linux ELF二进制文件的函数提取常量和argc

无法为Linux ELF二进制文件的函数提取常量和argc
EN

Stack Overflow用户
提问于 2021-02-17 18:10:25
回答 1查看 96关注 0票数 0

我使用的是最新版本的angr (9,0,'gitrollling')。我得到了与angr版本(9,0,4663)相同的行为。

使用gcc 9.3.0,我为这个简单的C程序创建了一个ELF二进制文件:

代码语言:javascript
运行
AI代码解释
复制
float func3(float y) {
  float temp = 5.5; // expected angr to find this constant
  return y + temp;
}

int main(int argc, char *argv[]) {
  float ans;
  ans = func3(2.2); // expected angr to find this constant
}

然后,我使用angr来提取函数中的常量(即'func3‘和'main')以及函数的参数数量。不幸的是,我得到的常量(下面输出中的“const”)或"argc“的答案没有任何意义。我得到了:

代码语言:javascript
运行
AI代码解释
复制
name main const [8, 32, 8, 32, 18446744073709551596, 18446744073709551584, 0, 4202504, 4202504,
    8, 4198767, 128, 4198697, 18446744073709551612, 0, 8, 8, 128] argc -1 

name func3 const [8, 18446744073709551596, 4202500, 4202500, 18446744073709551612,
     18446744073709551596, 0, 18446744073709551612, 8, 8, 128] argc -1 

我的angr代码:

代码语言:javascript
运行
AI代码解释
复制
#!/usr/bin/env python3

import angr
from angrutils import *

def get_attributes(cfg, addr):
    if addr in cfg.kb.functions:
        func = cfg.kb.functions.get_by_addr(addr)
        if func:
            name = func.demangled_name
            if name != 'main' and name != 'func3':
                return # only care about these 2 funcs
            const = func.code_constants
            argc = len(func.arguments) if func.arguments else -1
            print('  name %s const %s argc %s ' % (name, const, argc))
    return

proj = angr.Project('simple', main_opts={'backend': 'elf'}, load_options={'auto_load_libs':False})
main = proj.loader.main_object.get_symbol('main')

start_state = proj.factory.blank_state(addr=main.rebased_addr)
start_state.stack_push(0x0)
with hook0(proj):
    cfg = proj.analyses.CFGFast()  # using CFGEmulated() also does not change the answer!
    #cfg = proj.analyses.CFGEmulated(fail_fast=False, starts=[main.rebased_addr], context_sensitivity_level=1, enable_function_hints=False, keep_state=True, enable_advanced_backward_slicing=False, enable_symbolic_back_traversal=False,normalize=True)

d=dict()
for src, dst in cfg.kb.functions.callgraph.edges():
    if not d.get(src):             # only need to do this once.
        src_attr = get_attributes(cfg, src)
        d[src] = True              # mark completed
    if not d.get(dst):             # only need to do this once.
        dst_attr = get_attributes(cfg, dst)
        d[dst] = True              # mark completed

我哪里错了?

EN

回答 1

Stack Overflow用户

发布于 2021-02-28 03:21:28

我没有使用angr的经验,但基于对为您的程序生成的程序集的检查,我对哪里出了问题有一些假设:

  1. func3没有副作用,而且main不使用ans的值,所以编译器可以完全消除对func3的调用,例如,在x86-64上,我在main上得到了以下代码:

main: movl $0,%eax ret

所以常量2.2很可能根本不在可执行文件中。

  1. 浮点常量通常必须发送到内存并通过引用加载,例如,在x86-64上,我为func3获得了以下程序集:

.section .text func3: addss .LC0(%rip),%xmm0 ret .section .rodata .LC0:.long 1085276160

在完全链接的可执行文件中,交叉引用.LC0成为相对偏移量:

1125: f3 0f 58 05 d7 0e 00 00 addss 0xed7(%rip),%xmm0 112d: c3 retqIt可能无法将此偏移量识别为要提取的常量,或者它只能提取此偏移量而不能提取它所引用的.rodata中的值。即使它可以取出.rodata中的值,它知道应该将该值解释为单精度浮点数而不是整数的唯一方法是,它是否解码了使用该值的指令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66247619

复制
相关文章
ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)
一种是固定的、静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中;
233333
2018/10/09
8.5K0
ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)
【Android 逆向】ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )
进入 010 Editor 工具的插件模板下载页面 http://www.sweetscape.com/010editor/repository/templates/ ,
韩曙亮
2023/03/29
2K0
【Android 逆向】ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )
ELF文件程序表头和代码实现ELF文件加载
前面章节我们了解了ELF文件的头部结构,这次我们深入了解另一个非常重要的数据结构,那就是程序表头。操作系统严重依赖该结构来加载ELF文件或是实现动态链接。程序表头反映的是当ELF加载到内存后所形成的“视图”或结构,也就是说ELF文件存在硬盘上或者被加载到内存,它展现出来的形态不一致。
望月从良
2020/12/15
1.7K0
ELF文件程序表头和代码实现ELF文件加载
Linux无文件渗透执行ELF
注:本文仅用于知识分享,请勿用于非法攻击,任何后果与本团队无关。 01 简介 在进行Linux系统的攻击应急时,大家可能会查看pid以及/proc相关信息,比如通过/proc/$pid/cmdline查看某个可疑进程的启动命令,通过/proc/$pid/exe抓样本等,但是攻击者是否会通过某种类似于curl http://attacker.com/1.sh | sh的方法来执行elf二进制文件呢?最近看了一篇@MagisterQuis写的文章https://magisterquis.githu
xfkxfk
2018/05/15
5.6K0
【Android 逆向】ELF 文件格式 ( ELF 文件简介 | ELF 文件结构 )
ELF 文件是 Executable and Linkable Format ( 可执行 和 可链接 格式 ) 的文件 ;
韩曙亮
2023/03/29
1.3K0
【Android 逆向】ELF 文件格式 ( ELF 文件简介 | ELF 文件结构 )
【Android 逆向】ELF 文件格式 ( ELF 文件头 | ELF 文件头标志 | ELF 文件位数 | ELF 文件大小端格式 )
在上一篇博客 【Android 逆向】ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 ) 中 , 准备 ELF 文件解析环境 , 在 010 Editor 中安装了 ELF.bt 模板 ;
韩曙亮
2023/03/29
1.1K0
【Android 逆向】ELF 文件格式 ( ELF 文件头 | ELF 文件头标志 | ELF 文件位数 | ELF 文件大小端格式 )
elf文件解析器_elf文件下载
前两天网上投递了简历,面试了一家C++公司,然后对面负责人给我发了一份笔试题,题目是:
全栈程序员站长
2022/11/16
1.6K0
SCA技术进阶系列(三):浅谈二进制SCA在数字供应链安全体系中的应用
数字经济时代,随着开源应用软件开发方式的使用度越来越高,开源组件逐渐成为软件开发的核心基础设施,但同时也带来了一些风险和安全隐患。为了解决这些问题,二进制软件成分分析技术成为了一种有效的手段之一。通过对二进制软件进行成分分析,可以检测其中的潜在风险,并提供对用户有价值的信息。
OpenSCA社区
2023/07/21
9010
SCA技术进阶系列(三):浅谈二进制SCA在数字供应链安全体系中的应用
Linux上的程序是怎样运行的
就会出现如下结果。ps 在此处,我们可以人为ls为可执行程序的名称,--version 是该程序需要的参数。
高性能架构探索
2021/04/15
3.4K0
Linux下程序是怎样执行的
就会出现如下结果。ps 在此处,我们可以人为ls为可执行程序的名称,--version 是该程序需要的参数。
高性能架构探索
2021/04/13
5K0
Linux下程序是怎样执行的
c语言main函数里的参数argv和argc解析
一般我们平时写main函数的话,一般都是写不带参数的比较多,而且也习惯了这样写;其实标准的形式写法,main函数是带两个参数的,这两个参数分别是:argc和argv,那么这两个参数是表示什么意思,怎么用呢?今天就给大家分享main函数里面这两个参数的使用,下面看到这样的写法,要明白这样写的意思哦!
用户6280468
2022/03/21
3.2K0
c语言main函数里的参数argv和argc解析
Linux ELF笔记
最近在研究ARM cpu 32 bit转码 64bit的事情,以用于在64bit的服务器上可以更快的运行32bit的Android ELF文件。
用户6414482
2022/08/28
2.1K0
ELF文件分析
e_ident : 十六个字节,可通过这个字段对ELF文件进行识别,其中包括五个部分:
mingjie
2022/05/12
1.4K0
ELF文件分析
[CodeIgniter4]-公共函数和全局常量
CodeIgniter 你可以在任何地方使用它们,并且不需要加载任何 类库或辅助函数。
landv
2020/03/05
3.1K0
Linux 上无痛文件提取
从 Linux 系统的存档中提取文件没有拔牙那么痛苦,但有时看起来更复杂。在这篇文章中,我们将看看如何轻松地从 Linux 系统中可能遇到的几乎所有类型的存档中提取文件。
用户8639654
2021/09/14
1.5K0
Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序。
233333
2018/10/09
4.1K0
Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
ELF文件格式
1999年86open项目选择ELF作为x86处理器上Unix和类Unix系统的标准二进制文件格式。使用ELF的原因包括:灵活性、可扩展性、对不同字节序格式支持、跨平台支持地址size。
mingjie
2022/05/12
1.6K0
ELF文件格式
python解析elf文件
if __name__ == '__main__': file = sys.argv[1] verify_elf(file) display_elfhdr(file) display_sections(file)
py3study
2020/01/10
2.7K0
点击加载更多

相似问题

只从ELF二进制文件中提取函数名

30

Linux ARM ELF和iOS ARM ELF文件有什么不同?

10

FreeBSD和Linux中ELF文件结构

41

更改linux二进制elf文件中的strcpy参数

11

ELF二进制文件与'System‘和'Linux’的ABI相互兼容吗?

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档