Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法为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

复制
相关文章
jquery 列表可拖动排序 sortable
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery UI Sortable</title> <style type="text/css"> #myList{ width: 80px; background: #EEE; padding: 5px; list-style: none; } #myList a{ text-decoration: none; color: #0077B0; } #myList a:hover{ text-decoration: underline; } #myList .qlink{ font-size: 12px; color: #666; margin-left: 10px; } </style> </head> <body> <ul id="myList"> <li><a href="#">心情</a></li> <li> <a href="#">相册</a> <a href="#" class="qlink">上传</a> </li> <li> <a href="#">日志</a> <a href="#" class="qlink">发表</a> </li> <li><a href="#">投票</a></li> <li><a href="#">分享</a></li> <li><a href="#">群组</a></li> </ul>
用户5760343
2019/10/10
2.5K0
jquery 列表可拖动排序 sortable
jquery 列表可拖动排序,并把排序发送给后台
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
用户5760343
2019/10/10
1.5K0
jquery 列表可拖动排序,并把排序发送给后台
Python 面试题目—列表元素排序
Python题目:对列表[37,41.12,35,22,98,16,7,45,31]进行排序。
MySQL轻松学
2019/09/06
5490
Python 面试题目—列表元素排序
jQuery 元素操作
jQuery 元素操作主要讲的是用jQuery方法,操作标签的遍历、创建、添加、删除等操作。
星辰_大海
2020/10/09
2.7K0
jQuery 元素操作
jquery 元素尺寸
从上面的示例可以看到,使用width()和height()分别可以获取元素div的width和height的值。
Devops海洋的渔夫
2019/06/02
1.7K0
jQuery 元素操作
​ jQuery 元素操作主要讲的是用jQuery方法,操作标签的遍历、创建、添加、删除等操作。
梨涡浅笑
2022/05/08
2K0
jQuery 元素操作
jQuery 元素操作主要讲的是用jQuery方法,操作标签的遍历、创建、添加、删除等操作。
清出于兰
2020/10/26
1.4K0
jQuery 元素操作
20 - 如果列表元素是对象,该如何进行排序
1. 如果列表元素是对象,对这样的列表排序有哪些方法 ? class MyClass: def __init__(self): self.value = 0 ''' def __gt__(self, other): return self.value > other.value ''' def __lt__(self, other): return self.value > other.v
ruochen
2021/05/23
1.2K0
20 - 如果列表元素是对象,该如何进行排序
python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。本文主要讲述python中经常用的三种排序算法,选择排序法,冒泡排序法和插入排序法及其区别。通过对列表里的元素大小排序进行阐述。
zeruns
2020/03/23
1.8K0
列表元素分组
有这样一种场景,有三个列表a、b、c。我们想要把每一个列表中的第一个元素取出来分为一组,第二元素取出来分为一组、第三个元素取出来分为一组,以此类推。该怎么做呢?你可以自己想一想,再来看下面的实现过程。
TalkPython
2019/05/24
1.1K0
jquery 筛选元素 (2)
.add()   创建一个新的对象,元素添加到匹配的元素集合中。   .add(selector)     selector 一个字符串表示的选择器表达式。找到更多的元素添加到匹配的元素集合。       $("p").add("div")   .add(html)     html       HTML片段添加到匹配的元素集合中。         $('li').add('<p id="new"> new paragraph</p>')   .add(elements
用户1197315
2018/01/19
1.3K0
jQuery - 添加元素
jQuery append() 方法在被选元素的结尾插入内容(仍然在该元素的内部)。
陈不成i
2021/07/22
2.7K0
jQuery操作DOM元素
作为一个后端程序员,也是要和前端页面打交道的。最常见的场景莫过DOM元素操作和前端页面使用AJAX向服务器发送请求。 实现上述两个功能当然可以使用原生js来完成,但在实际开发过程中很少这样做,通常会使用一些别人封装好的js库来辅助我们的工作,jQuery就是这些辅助库中的一员。
雪飞鸿
2018/09/05
2.8K0
jquery 筛选元素 (3)
.addBack()   添加堆栈中元素集合到当前集合中,一个选择性的过滤选择器。   .addBack([selector])     selector     一个字符串,其中包括一个选择器表达式,匹配当前元素集合,不包括在内的元素。     <ul>       <li>list item 1</li>       <li>list item 2</li>       <li class="third-i
用户1197315
2018/01/19
1.5K0
JQuery生成图片列表
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>生成图片列表</title> 5 <style type="text/css"> 6 *{ margin: 0px; padding: 0px; } 7 .bpp4{ width: 700px; height: 280px; padding-left: 10px; padding-bottom: 10px; border: 1px solid #333333
彼岸舞
2020/09/30
8K0
jQuery 选取元素概要
注意: 对于 jQuery 自定义的选择器,为了性能,先用 CSS 定义的选择器选,再从结果集中筛选时用 jQuery 自定义的选择器。如:
前端GoGoGo
2018/08/24
1.4K0
python中列表排序,字典排序,列表中的字典排序
key= lambda dict1:dict1[0] #dict1[0]表示按键,dict1[1]表示按值。
用户8346838
2021/03/10
9.7K0
jquery 筛选元素(1)
.eq()   减少匹配元素的集合为指定的索引的那一个元素。   .eq(index)     index一个整数,指示元素的位置,以0为基数。   $("li").eq(2).css('background-color', 'red')     //选择第三个元素将其 将其背景变成红色。   .eq(-index)     -index 一个整数,指示元素的位置,从集合中的最后一个元素开始倒数。   $("li").eq(-2).css('background-color'
用户1197315
2018/01/19
1.4K0
数列的重新排序
x2<-c("jimmy","nicker","damon","sophie","tony")
用户10325558
2023/02/03
4980
Python 列表排序
本文最先发布在: https://www.itcoder.tech/posts/python-list-sort/
雪梦科技
2020/06/05
1.8K0

相似问题

使用鼠标jquery重新排序列表元素

25

使用jQuery重新排序元素

10

重新排序列表元素

10

jQuery -拖放列表重新排序

32

如何重新排序下拉列表(jquery)

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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