TA的每日心情 | 开心 2023-10-11 21:31 |
|---|
签到天数: 104 天 [LV.6]常住居民II
|
A内存执行ELF研究 无痕注入的最新消息可以到我们平台网站了解一下,也可以咨询客服人员进行详细的解答!
初遇
在L系统中,我们可以通过_和现内存运行ELF,但是在A中,却遇到了这样的问题
1
CANNOTLINKEXECUTABLE
""
:
""
:
64
_
()
通过了解到可以通过LD_DEBUG环境变量开启日志,执行
LD_DEBUG=1
并通过抓到了如下日志
1
2
3
4
5
6
7
8
9
32
33
W:[A(
64
-
)]
W:[L
""
]
W:[L
"[]"
]
W:[R
""
]
W:[U
"****"
]
W:[L
""
]
W:[L
"64"
]
W:[L
"64"
]
W:[L
"64"
]
W:[L
"64"
]
W:[L
"64++"
]
W:[L
"64_"
]
W:[L
"64"
]
W:[L
"64"
]
W:[CFI
00
+
7000
]
W:[CFI
778000
+
000
-
1
]
W:[CFI
77648000
+
0000
]
W:[CFI
77387000
+
7000
]
W:[CFI
77000
+
000
]
W:[CFI
770
+
000
]
W:[CFI
77600
+
0000
+
+
]
W:[CFI
773945000
+
000
_:
77394000
]
W:[CFI
773900
+
00
]
W:[CFI
77384000
+
000
]
W:[CFI
773900
+
00
]
W:[CFI
77384000
+
000
]
W:[J_(
0
)]
W:[A(
64
-
)]
W:[L
":-()"
]
W:[L
"[]"
]
W:[R
""
]
W:[L
":-()"
]
F:CANNOTLINKEXECUTABLE
""
:
""
:
64
_
(
*
*
*
*
)
看起来是命空间的问题,我们的的命空间为,但是为什么会这样呢,明明是。
相知
通过G搜索看到官方文档,在文件中配置了相关信息
1
2
3
4
5
6
7
8
9
=
=
64
=
=
=
=
=
=
[]
=
__,__,__,__,__,__,__,___,__,__,__,,,,_
=
=
=
${LIB}
首先我们要知道这个文件可不可以写,查看信息发现该文件所在的不是只读文件系统,所以可以直接修改
1
2
3
#|
,,,,,,
=
5846680
,_
=
670
,
=
755
0
0
,,,,,,
=
5846680
,_
=
670
,
=
755
0
0
以下使用编辑文件
接
原来命空间是根据路径来的,于是编辑该文件,在比较前面手动加上一行
1
=
:
然后重新执行,问题依旧。
化
难道是没有路径分割符的问题,于是在代码中给文件加上一个
1
_(“
-
”,MFD_CLOEXEC);
编译并重新执行,还是一样的报错。
发
1
=
这次报错多了一行
1
WARNING::
:
1
::
()
看样子是没办法通过单纯的改配置文件完成了,于是前往阅读的源码
相识
由于服务比较近不太稳定,我在看的时候刚好打不开,使用了官方的,然而这个玩意并不好用
众所周知,的源码在目录下。
通过字符串“U”定位到_的函数,在阅读代码后,我们上面的尝试为什么会失败,就已经有了答案。
为什么设置:目录不行
1
2
3
4
5
6
7
8
9
((_(),R_OK)!
=
0
){
(
=
=
ENOENT){
-
;
}
I
,'
SELU
_
=
;
}
因为它不是一个真存在的目录,在代码中通过函数判断改路径不存在,所以不行
为什么设置根目录不行
1
2
3
4
5
6
7
8
9
''
(!()()
=
=
''
){
_();
}
(()){
DL_WARN(
"%:%::()"
,
___,
());
;
}
因为代码中删除了末尾所有的符号,传入根目录之后字符串变成了空字符串,于是抛出了那个W
相杀
修改非两个思路:
静态替换
动态
虽然有,替换分区下文件变得方便了起来,但是替换依然是一件麻烦事,动态H对于解决这个问题来说,我觉得更加方便。由于目标代码位置的特殊性,现有,轮子都不能取得比更早的执行时机。
也许是我孤陋寡闻,如果有请务必告诉我
比较终我选择的方案是先生成一个子进程,对子进程进行,修改逻辑后再掉。
对于逻辑的修改,主要有两步:
给添加"=:\”
让这个目录返回0
首步
直接编辑该文件添加上述行即可
第二步
1
2
3
4
5
6
7
8
9
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
_(::,
*
*
,
*
*
){
创建内存文件,设置这个参数会在
后自动关闭这个文件
=
_(
"-"
,MFD_CLOEXEC);
(,(
)());
设置文件长度
*
=
(,(),PROT_WRITE,MAP_SHARED,,
0
);
(,(),());
(,());
此时已经将ELF内容写入到内存文件里面
=
();
(
0
){
(
"_\"
);
失败
;
}
(
=
=
0
){
这里是子进程,使用PTRACE_TRACEME主动建立连接
(PTRACE_TRACEME);
(,,);
}
这里是父进程
;
__{};
{};
_
=
;
_
=
(__);
(){
();
等待子进程暂停
(WIFEXITED()){
;
子进程退出
}
读取通用寄存器,系统调用号
(PTRACE_GETREGSET,,NT_PRSTATUS,);
([
8
]
=
=
__NR_){
函数使用的系统调用号
[]
=
":"
;
;
注意,PTRACE_PEEKDATA固定一次读取(
)字节长度的内容
=
(PTRACE_PEEKDATA,,[
1
],NULL);
((,(
*
))
=
=
0
){
判断是否是我们添加的目录
(PTRACE_SINGLESTEP,,NULL,NULL);
单步执行,让系统调用执行完
();
等待系统调用执行完
(PTRACE_GETREGSET,,NT_PRSTATUS,);
读取寄存器
[
0
]
=
0
;
修改返回值为寄存器
(PTRACE_SETREGSET,,NT_PRSTATUS,);
修改寄存器
(PTRACE_DETACH,,NULL,NULL);
进程
;
}
}
(PTRACE_SYSCALL,,NULL,NULL);
执行到下一个系统调用时暂停
}
;
} |
|