我正在使用msys和mingw环境在Windows上运行bash脚本.我似乎有一个问题,使用像'cut'或sed'这样的命令会导致每次调用的开销.我不确定这是否是Windows运行.exe的影响或者是什么.反正这里是我的代码:
SOMETHING=`m6811-elf-readelf.exe -l "${TARGET_BASENAME}.elf" | sed '1,/Type / d' | sed '1,/^$/!d'`
echo "$SOMETHING" | while read -r line; do
# MEMORY_ADDRESSES=`echo $line | sed -ne 's/LOAD[^0-9a-z]*0x\([^ ]*\) 0x\([^ ]*\) 0x\([^ ]*\) 0x\([^ ]*\) 0x\([^ ]*\) .*/\1 \2 \3 \4 \5/p;'`
OFFSET=`echo "$line" | cut -f12 -d\ `
VIRTADDR=`echo "$line" | cut -f13 -d\ `
PHYSADDR=`echo "$line" | cut -f14 -d\ `
FILESIZE=`echo "$line" | cut -f15 -d\ `
MEMSIZE=`echo "$line" | cut -f16 -d\ `
echo $OFFSET $VIRTADDR $PHYSADDR …Run Code Online (Sandbox Code Playgroud) 我想编写一个读取二进制字符串表的程序.二进制在ELF上运行在REDHAT linux 32上.我做了以下 -
以下是我的程序的输出.
Entry Address of Binary - 0x8048340
Start of Program Header - 52
Start of section header - 3272
Size of header - 52
Number of section headers - 36
Size of each section headers - 40
Number of section headers - 36
Section header Offset - 3272
string tbl index for section[0] is 0
string tbl index for section[1] is 27
string tbl index for section[7] is 35
string tbl index for section[1879048182] …Run Code Online (Sandbox Code Playgroud) 我想在cygwin上使用objdump命令.我得到了例外:
-bash:objdump:找不到命令
为什么cygwin无法找到objdump?
编辑----我可以在http://cygwin.com/packages/上看到binutils .一旦我找到binutils包,我点击它就会把我带到这里.我该如何安装?我到那儿后该怎么办?
我正在写一个x86二进制解释器.
目前我正在处理加载可执行文件和共享对象.但是我有些疑惑:
1)动态链接器/加载器是否连接主可执行文件和共享库的.ini部分,以便为进程映像生成一个.ini部分?对于.fini部分?
2)它是否连接了许多符号和字符串表?
3)我对重新安置感到失望.它们应该在二进制加载时或者在调用过程时发生?我想我不明白动态链接器/加载器如何管理重定位.
4)为什么存在.hash和.gnu.hash部分?为什么我需要'哈希'一个符号?
欢迎链接,评论和明显的答案.
我知道我们可以通过读取符号表来获取elf中用户定义函数的开始地址,如下所示,函数main和foo:
08048330 T _start
0804a014 b completed.6159
0804a00c W data_start
0804a018 b dtor_idx.6161
080483e4 T foo
080483c0 t frame_dummy
080483ee T main
Run Code Online (Sandbox Code Playgroud)
但如何获得某些功能的结束地址?
谁能给我一些帮助?谢谢!
首先我读了地址是.data和.text持有字符串文字(加上我想的机器代码)之后在其他文章中有人说它已经改变了,而更长的字符串文字存在于.text但是.rodata而不是(这是真的我的铿锵声)编译器输出).但.data内容与我在C程序中的printf地址不匹配.
假设这个C程序:
static int a;
int main()
{
printf("my address = %p\n", &a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个C程序的输出:
$ ./a.out
my address = 0x804a01c
Run Code Online (Sandbox Code Playgroud)
然后是.data部分的内容:
$ objdump -s -j .data a.out
a.out: file format elf32-i386
Contents of section .data:
804a00c 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
0x804a01c这个内容没有.地址在哪里?
我正在编写一些自定义的ELF二进制后处理代码,它可以处理.o文件.部分处理包括对二进制数据执行重定位.输入文件由GNU汇编器根据我自己的汇编代码生成.
看看GNU汇编器生成的这些疯狂的重定位:
Relocation section '.rel.bss' at offset 0x3b8 contains 2 entries:
Offset Info Type Sym.Value Sym. Name
0000010b 00000301 R_386_32 00000000 .bss
00000110 00000301 R_386_32 00000000 .bss
首先,重新定位数据没有任何意义.bss.根据定义,数据.bss全部为零,无法调整为其他内容.
其次,相对于自己节的基地址重新定位值没有任何意义.这将是一个无操作.
那是什么给了?? 这些重新安置应该是什么意思?
(进入此二进制文件的asm代码包含以下内容:
.bss
keybuffer:
.space 256
Run Code Online (Sandbox Code Playgroud)
...然后:
.bss
anotherbuffer:
.space 4
Run Code Online (Sandbox Code Playgroud)
这就是上面你可以看到的补偿来自.)
我试图在我的Heroku实例中导入tensorflow,并且我不断收到以下错误:
File "/app/tools/inception/classify_image.py", line 45, in <module>
2016-06-23T19:08:18.090957+00:00 app[clock.1]: import tensorflow as tf
2016-06-23T19:08:18.090979+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/site-packages/tensorflow/__init__.py", line 23, in <module>
2016-06-23T19:08:18.091005+00:00 app[clock.1]: from tensorflow.python import *
2016-06-23T19:08:18.091011+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/site-packages/tensorflow/python/__init__.py", line 45, in <module>
2016-06-23T19:08:18.091050+00:00 app[clock.1]: from tensorflow.python import pywrap_tensorflow
2016-06-23T19:08:18.091068+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
2016-06-23T19:08:18.091112+00:00 app[clock.1]: _pywrap_tensorflow = swig_import_helper()
2016-06-23T19:08:18.091116+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
2016-06-23T19:08:18.091136+00:00 app[clock.1]: _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
2016-06-23T19:08:18.091166+00:00 app[clock.1]: ImportError: /app/.heroku/python/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so: invalid ELF header
Run Code Online (Sandbox Code Playgroud)
有人会知道为什么吗?我的requirements.txt中有以下行:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl
Run Code Online (Sandbox Code Playgroud)
我不确定无效的ELF标头是什么意思.我错过了依赖还是什么?
我正在研究一个混淆的二进制文件作为crackme挑战的一部分.它得到的序列push,pop并nop指令(该指令将重复数千次).从功能上讲,这些块对程序没有任何影响.但是,他们非常努力地生成CFG和逆转过程.
有关于如何将指令更改为nop的解决方案,以便我可以删除它们.但在我的情况下,我想完全剥离这些指令,以便我可以更好地了解CFG.如果指令被剥离,我理解必须修改内存偏移量.据我所知,没有工具可以直接实现这一目标.
我正在使用IDA Pro评估版.我也对使用其他逆向工程框架的解决方案持开放态度.如果它是可编写脚本的,则是可取的.
我经历了一个类似的问题但是,建议的解决方案不适用于我的情况.
我知道两者之间的关系:
虚拟地址mod页面对齐==文件偏移mod页面对齐
但有人能告诉我这两个数字的计算方向是什么?
是否根据上述关系从文件偏移量计算虚拟地址,反之亦然?
下面是一些更详细的信息:当链接器写入ELF文件头时,它设置程序头的虚拟地址和文件偏移量.(段)
例如,有以下输出readelf -l someELFfile:
Elf file type is EXEC (Executable file)
Entry point 0x8048094
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 R E 0x1000
LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
Run Code Online (Sandbox Code Playgroud)
我们可以看到2个LOAD段.
第一个LOAD的虚拟地址以0x8048154结束,而第二个LOAD从0x8049154开始.
在ELF文件中,第二个LOAD紧跟在第一个LOAD后面,文件偏移量为0x00154,但是当这个ELF加载到内存中时,它在第一个LOAD段结束后的0x1000字节处开始.
但为什么?如果我们必须考虑内存页面对齐,为什么第二个LOAD段不是从0x80489000开始?为什么它在第一个LOAD段结束后的0x1000字节处开始?
我知道第二个LOAD的虚拟地址满足关系:
虚拟地址mod页面对齐==文件偏移mod页面对齐
但我不知道为什么必须满足这种关系.
elf ×10
linux ×5
assembly ×2
gcc ×2
32-bit ×1
bash ×1
binary ×1
c ×1
c++ ×1
cygwin ×1
disassembly ×1
dwarf ×1
heroku ×1
interpreter ×1
linker ×1
objdump ×1
performance ×1
pip ×1
ptrace ×1
python-2.7 ×1
symbol-table ×1
tensorflow ×1
variables ×1
x86 ×1