如果我可以读取任意不受信任的内存地址,是否可以重建 nexe 文件?

逆向工程 linux 小精灵 x64 amd64
2021-07-10 17:00:24

好的,我处于远程情况,我无权访问远程文件系统,但我可以运行任意 python 代码(除了我不能 fork 进程并且我无权访问 ulimit 和 uname)

但是,这意味着我可以在任意虚拟内存地址上读写。我知道 python 解释器是静态链接的,所以它没有外部共享对象依赖项。
虽然启用了nx,但奇怪的是aslr似乎被禁用了。
我已经确定并转储了以下内容和位置永远不会改变的区域:

0x00010000:0x00050000 # read only and executable
0x01000000:0x01b80000 # read only and executable
0x11000000:0x1158c000 # writable
# The heap is located between those 2 places and it’s location is chose at random
0xfe500000:0xffffffff # writable

在这种情况下,是否可以重建 ᴇʟꜰ 二进制文件?(它是为本地客户端编译的)它不必是带有原始标头的原始二进制文件,而只是一个可以从各种解析的 ᴇʟꜰ 段中启动的可执行文件。

更新 :

与普通的 nexe 不同,编译后的 python.nexenacl_interp只能在 Linux 上运行。这意味着 ᴇʟꜰ 标头中的目标 ᴏꜱ 设置为 0x7B (而正常的 nexe 是独立的 ᴏꜱ)

libc 是 glibc。另见https://groups.google.com/forum/#!topic/native-client-discuss/t54RajuGnPc

1个回答

如果可以泄漏进程地址空间中的任何地址,则可以重建整个二进制文件。作为一个例子,这里是一个进程的内存映射

$cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:01 10223630                           /bin/cat
0060b000-0060c000 r--p 0000b000 08:01 10223630                           /bin/cat
0060c000-0060d000 rw-p 0000c000 08:01 10223630                           /bin/cat
0232c000-0234d000 rw-p 00000000 00:00 0                                  [heap]
.
.
.
.
7ffef94f3000-7ffef9514000 rw-p 00000000 00:00 0                          [stack]
7ffef95cd000-7ffef95cf000 r--p 00000000 00:00 0                          [vvar]
7ffef95cf000-7ffef95d1000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

映射中的前三个部分包含可执行文件本身。您只需要泄漏该部分,然后就可以重新组装以形成可执行文件。

如果二进制文件没有启用PIE,则每次运行二进制文件时,可执行代码的位置都是静态的,如上例所示。默认情况下,您将获得 0x8048000 32 位加载地址和 0x400000 64 位加载地址。但是,这可以在链接过程中更改。您可以在进程空间中搜索“ELF”,您的可执行文件可能会从那里开始。