内存安全试验:ret2libc绕过DEP 遇到的问题

实验见另一博客:https://mp.csdn.net/postedit/89948519

 

目录

 

 

问题1:一直复现不成功的原因

问题2:关于linux32进入32位环境的问题

问题3:关于新建用户

问题4:为什么要对retlib程序设置set-UID位?

问题5:retlib程序的编译为什么要在root身份下进行?

问题6:为什么要用/bin/zsh?

问题7:三个程序实际运行的地址差异

不同程序环境变量及地址差异


 

问题1:一直复现不成功的原因

之前一直复现不成功,是因为我们这个实验要用到zsh来代替bash,但是自己的系统中没有zsh,所以需要安装这个shell,

问题2:关于linux32进入32位环境的问题

后面自己实验,加不加那个都可以的

问题3:关于新建用户

这个其实也可以不用,

问题4:为什么要对retlib程序设置set-UID位?

对于设定retlib.c为set-UID程序这一步骤:如果不进行这一步骤,则最后攻击成功之后,跳出来的是一个普通的shell,即$:  ;但是设置了这一步之后,攻击成功之后,跳出来的是#:  ;就是一个root身份的shell。(已验证)

 

问题5:retlib程序的编译为什么要在root身份下进行?

在普通用户下编译,在root身份下set-UID,可以看到retlib程序的用户依旧是ningan,所以最后攻击之后得到的shell就是一个普通的shell。

 

正确的做法是在root下编译,root下set-UID进行提权,这样程序的用户就变成了root,攻击成功之后就是#(root身份)

 

 

问题6:为什么要用/bin/zsh?

以前的retlib程序是chmod特权程序,以暂时root的身份执行了shellcode,而/bin/sh真实的指向是/bin/zsh,zsh不会收回特权,所以这个shell一直以root身份执行。

显示zsh: command not found: quit   说明这个时候的shell是/bin/zsh

 

问题7:三个程序实际运行的地址差异

首先要关闭地址随机化

 

地址差异
 getenvaddr(10)retlib(6)expl(4)
直接在shell中运行(通过getenv()获取)0xffffde28 +8=0xffffde30 +4=0xffffde34
在gdb中通过列出所有的环境变量进行寻找0xffffde1e0xffffde220xffffde24
在gdb中运行程序(通过getenv()获取)0xffffde1e +4 0xffffde22 +2=0xffffde24

 

 

 

 

 

 

 

 

 

 

 

从上面的表格可以看出:

(1)在shell中运行时,这几个程序地址的差异是它们程序名的二倍,这也是本次实验利用getenvaddr.c加上偏移获取retlib.c环境变量的方法,具体原因见这个博客的末尾:https://www.cnblogs.com/xidian-wws/p/10819073.html

(2)在gdb中不管是上面两种方法中的哪一种,同一程序获取到的地址都是一样的,但是不同程序获取到的地址偏移是它们程序名的一倍,这个原因尚没有找出来,希望知道的朋友告知;

(3)retlib是漏洞程序,getenvaddr和expl是攻击程序,这两个攻击程序其实是可以合并的,我们的目的就是通过攻击程序猜漏洞程序环境变量的地址;

(4)假设不用getenvaddr,只用expl这个攻击程序:可以通过在shell中运行expl程序(程序中会利用getenv函数获取程序变量地址),然后加上expl和retlib程序名偏移量的二倍来猜测retlib程序环境变量的地址;也可以通过在expl的gdb中获取到环境变量的地址后,加上他们程序名偏移量的一倍来获取retlib程序环境变量的地址(已验证)

(5)假设是在gdb中获取到的地址,那么retlib只能在gdb中运行才能攻击成功,在shell中运行是不会攻击成功的,因为同一环境变量在shell中和在gdb中的地址是不一样的

(关于这个的解释,老师说因为gdb调试是静态的,shell运行是动态的,地址肯定不一样;

一个大神的解释是:gdb的调试环境会影响buf在内存中的位置,虽然关闭了ASLR,但这只能保证buf的地址在gdb的调试环境中不变,但当直接执行的时候,buf的位置会固定在别的地址上)

感觉大神的这个解释应该某一函数中的局部变量在gdb和直接运行时地不一样的原因,我现在也不是很懂

(6)对于(5),在gdb中攻击成功的话,获取的是普通用户的shell,不是root,现在我也不知道能不能获取到root以及如何获取到root

 

以程序expl.c为例说明这些地址的获取方法(加粗的是自己输入的部分,红色是一些重要内容)

 

ningan@ubuntu:~/anan/ret2libc$ gcc -m32 -g -o expl expl.c

ningan@ubuntu:~/anan/ret2libc$ ./expl BIN_SH
BIN_SH will be at 0xffffde34
ningan@ubuntu:~/anan/ret2libc$ gdb -q expl
Reading symbols from /home/ningan/anan/ret2libc/expl...done.
(gdb) list
1    #include <stdlib.h>
2    #include <stdio.h>
3    #include <string.h>
4    
5    int main(int argc, char **argv, char *envp[])
6    {
7     char buf[40];
8     FILE *badfile;
9     char *ptr;
10     badfile = fopen(".//badfile", "w");
(gdb) b 7
Breakpoint 1 at 0x8048537: file expl.c, line 7.
(gdb) run 
Starting program: /home/ningan/anan/ret2libc/expl 

Breakpoint 1, main (argc=1, argv=0xffffd3c4, envp=0xffffd3cc) at expl.c:10
10     badfile = fopen(".//badfile", "w");
(gdb) p envp
$1 = (char **) 0xffffd3cc
(gdb) x/500sb *0xffffd3cc
0xffffd558:     "SSH_AGENT_PID=2548"
0xffffd56b:     "GPG_AGENT_INFO=/tmp/keyring-BIGWwf/gpg:0:1"
0xffffd596:     "SHELL=/bin/bash"
0xffffd5a6:     "TERM=xterm"
0xffffd5b1:     "XDG_SESSION_COOKIE=7a7a2f572dbd5adb18bca55b00000007-1557276113.109114-1887978045"
0xffffd602:     "WINDOWID=52428806"
0xffffd614:     "GNOME_KEYRING_CONTROL=/tmp/keyring-BIGWwf"
0xffffd63e:     "USER=ningan"
0xffffd64a:     "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31"...
0xffffd712:     ":*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.d"...
0xffffd7da:     "eb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35"...
0xffffd8a2:     ":*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mk"...
0xffffd96a:     "v=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35"...
0xffffda32:     ":*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00"...
0xffffdafa:     ";36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:"
0xffffdb6b:     "XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0"
0xffffdba5:     "XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0"
0xffffdbd9:     "SSH_AUTH_SOCK=/tmp/keyring-BIGWwf/ssh"
0xffffdbff:     "DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path"
0xffffdc32:     "SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/2514,unix/ubuntu:/tmp/.ICE-unix/2514"
0xffffdc84:     "COLUMNS=133"
0xffffdc90:     "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg"
0xffffdcbd:     "DESKTOP_SESSION=ubuntu"
0xffffdcd4:     "PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
0xffffdd3a:     "_=/usr/bin/gdb"
0xffffdd49:     "PWD=/home/ningan/anan/ret2libc"
0xffffdd68:     "LANG=en_US.UTF-8"
0xffffdd79:     "GNOME_KEYRING_PID=2504"
0xffffdd90:     "MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path"
0xffffddc6:     "COMPIZ_CONFIG_PROFILE=ubuntu"
---Type <return> to continue, or q <return> to quit---
0xffffdde3:     "UBUNTU_MENUPROXY=libappmenu.so"
0xffffde02:     "LINES=37"
0xffffde0b:     "GDMSESSION=ubuntu"
0xffffde1d:     "BIN_SH=/bin/sh"
0xffffde2c:     "SHLVL=1"
0xffffde34:     "HOME=/home/ningan"
0xffffde46:     "GNOME_DESKTOP_SESSION_ID=this-is-deprecated"
0xffffde72:     "LOGNAME=ningan"
0xffffde81:     "DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-u20SORJaFU,guid=01d9b6a813e81470134d715500000054"
0xffffdee3:     "XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
0xffffdf32:     "LESSOPEN=| /usr/bin/lesspipe %s"
0xffffdf52:     "DISPLAY=:0.0"
0xffffdf5f:     "XDG_CURRENT_DESKTOP=Unity"
0xffffdf79:     "LESSCLOSE=/usr/bin/lesspipe %s %s"
0xffffdf9b:     "XAUTHORITY=/home/ningan/.Xauthority"
0xffffdfbf:     "COLORTERM=gnome-terminal"
0xffffdfd8:     "/home/ningan/anan/ret2libc/expl"

(gdb) x/sb 0xffffde1d+7
0xffffde24:     "/bin/sh"
(gdb) run BIN_SH
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/ningan/anan/ret2libc/expl BIN_SH

Breakpoint 1, main (argc=2, argv=0xffffd3c4, envp=0xffffd3d0) at expl.c:10
10     badfile = fopen(".//badfile", "w");
(gdb) p envp
$2 = (char **) 0xffffd3d0
(gdb) x/500sb *0xffffd3d0
0xffffd558:     "SSH_AGENT_PID=2548"
0xffffd56b:     "GPG_AGENT_INFO=/tmp/keyring-BIGWwf/gpg:0:1"
0xffffd596:     "SHELL=/bin/bash"
0xffffd5a6:     "TERM=xterm"
0xffffd5b1:     "XDG_SESSION_COOKIE=7a7a2f572dbd5adb18bca55b00000007-1557276113.109114-1887978045"
0xffffd602:     "WINDOWID=52428806"
0xffffd614:     "GNOME_KEYRING_CONTROL=/tmp/keyring-BIGWwf"
0xffffd63e:     "USER=ningan"
0xffffd64a:     "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31"...
0xffffd712:     ":*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.d"...
0xffffd7da:     "eb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35"...
0xffffd8a2:     ":*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mk"...
0xffffd96a:     "v=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35"...
0xffffda32:     ":*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00"...
0xffffdafa:     ";36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:"
0xffffdb6b:     "XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0"
0xffffdba5:     "XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0"
0xffffdbd9:     "SSH_AUTH_SOCK=/tmp/keyring-BIGWwf/ssh"
0xffffdbff:     "DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path"
0xffffdc32:     "SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/2514,unix/ubuntu:/tmp/.ICE-unix/2514"
0xffffdc84:     "COLUMNS=133"
0xffffdc90:     "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg"
0xffffdcbd:     "DESKTOP_SESSION=ubuntu"
0xffffdcd4:     "PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
0xffffdd3a:     "_=/usr/bin/gdb"
0xffffdd49:     "PWD=/home/ningan/anan/ret2libc"
0xffffdd68:     "LANG=en_US.UTF-8"
0xffffdd79:     "GNOME_KEYRING_PID=2504"
0xffffdd90:     "MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path"
0xffffddc6:     "COMPIZ_CONFIG_PROFILE=ubuntu"
---Type <return> to continue, or q <return> to quit---
0xffffdde3:     "UBUNTU_MENUPROXY=libappmenu.so"
0xffffde02:     "LINES=37"
0xffffde0b:     "GDMSESSION=ubuntu"
0xffffde1d:     "BIN_SH=/bin/sh"
0xffffde2c:     "SHLVL=1"
0xffffde34:     "HOME=/home/ningan"
0xffffde46:     "GNOME_DESKTOP_SESSION_ID=this-is-deprecated"
0xffffde72:     "LOGNAME=ningan"
0xffffde81:     "DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-u20SORJaFU,guid=01d9b6a813e81470134d715500000054"
0xffffdee3:     "XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
0xffffdf32:     "LESSOPEN=| /usr/bin/lesspipe %s"
0xffffdf52:     "DISPLAY=:0.0"
0xffffdf5f:     "XDG_CURRENT_DESKTOP=Unity"
0xffffdf79:     "LESSCLOSE=/usr/bin/lesspipe %s %s"
0xffffdf9b:     "XAUTHORITY=/home/ningan/.Xauthority"
0xffffdfbf:     "COLORTERM=gnome-terminal"
0xffffdfd8:     "/home/ningan/anan/ret2libc/expl"
(gdb) c 7    //清除行号为7处的断点
Will ignore next 6 crossings of breakpoint 1.  Continuing.
BIN_SH will be at 0xffffde24
[Inferior 1 (process 3108) exited normally]
(gdb) 

 

 

 

 

 

不同程序环境变量及地址差异

retlib.c

expl.c
(gdb)run(gdb)run
argc=1, argv=0xffffd3c4, envp=0xffffd3ccargc=1, argv=0xffffd3c4, envp=0xffffd3cc
(gdb)x/100sb *0xffffd3cc(gdb)(gdb)x/100sb *0xffffd3cc

0xffffd557  "SSH_..."

...

0xffffde1b  "BIN_SH=/bin/sh"

0xffffd559  "SSH_..."

...

0xffffde1d  "BIN_SH=/bin/sh"

 

 

 

 

 

 

 

 

 

 

 

 

可以看到,这两个程序的环境变量地址是一样的,但是环境变量所指向的空间是不一样的,差了两个字节,自己也还没有想明白?

自己整了一份他们的内存比较,见自己的笔记。

 

expl.c part

 

retlib.c part1

expl.c part2

retlib.c part2

 

 

 

 

 

 

 

 

 

 

 

 

 

这个例子说明,对于同一个程序,找其环境变量的地址时,加不加那个参数都是一样的,只是环境变量的地址变量一点,但是环境变量所指向的

空间是一样的

 

 

 


 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值