在 ELF 二进制文件上使用radare2 查找隐藏字符串位置

逆向工程 拆卸 部件 C 小精灵 雷达2
2021-06-20 00:39:26

我正在研究一些逆向工程示例程序(IOLI crackmes)crackme0x00-crackme0x09,它们是gcc编译的ELF格式二进制文件。我是一位同事提供的,可以从radare的github站点下载(我无法添加链接,因为我没有信誉点)。我想我可以提供足够的信息来提出一个格式正确的问题。

我目前正在研究crackme0x09,但遇到了障碍。我主要拆解: 拆开的主

我注意到第一次调用sym.imp.printf是从ebx偏移量引用寄存器中获取它的输入[ebx - 0x178b]

ebx寄存器设置,首先,在fcn.08048766我拆机: 拆机 fcn.08048766

因此,按顺序:1) 0x84esp 2) 中减去2) ebx设置等于esp包含的位置fcn.08048766mov ebx, dword[esp] 3) 0x18f7添加到新值ebx 4) eax加载这个新地址减去和偏移量lea eax, [ebx - 0x178b] 5) 然后推送到堆栈sym.imp.printf上打印

如果我打印程序数据部分中的所有字符串(使用iz命令),我可以在那里看到它们,但是我很难理解如何解释结果:

vaddr=0x08048838 paddr=0x00000838 ordinal=000 sz=5 len=4 section=.rodata type=ascii string=LOLO
vaddr=0x0804883d paddr=0x0000083d ordinal=001 sz=21 len=20 section=.rodata type=ascii string=Password Incorrect!\n
vaddr=0x08048855 paddr=0x00000855 ordinal=002 sz=14 len=13 section=.rodata type=ascii string=Password OK!\n
vaddr=0x08048863 paddr=0x00000863 ordinal=003 sz=6 len=5 section=.rodata type=ascii string=wtf?\n
vaddr=0x08048869 paddr=0x00000869 ordinal=004 sz=25 len=24 section=.rodata type=ascii string=IOLI Crackme Level 0x09\n
vaddr=0x08048882 paddr=0x00000882 ordinal=005 sz=11 len=10 section=.rodata type=ascii string=Password:

我的问题:如何判断引用的字符串[ebx - 0x178b]和后续ebx偏移量?

谢谢。

1个回答

您正在查看所谓的位置无关代码 (PIC)。程序使用辅助函数获取当前执行地址ebx,然后添加一个delta来计算GOT的地址(这是有效的,因为即使文件移入内存后,包括GOT的数据段仍然在与函数相同的偏移量)。要计算ebx,您只需要记住该call指令将返回地址压入堆栈,因此里面fcn.08048766 [esp]将包含0x80486fd. 加上0x18f7,我们得到0x8049FF4哪个应该是GOT地址,然后你可以减去0x178b得到0x8048869哪个应该是字符串。