湖南大学Bump 实验 第一关
201608010419 李汉俊
2018年4月15日
(1)在这个实验之前,为了解决能够把电脑的文件传送到,虚拟机上,从百度查了,通过建立共享文件夹,可以使得完成共享。步骤如下:
关于把电脑本机文件共享给虚拟机
1、先在电脑建一个共享文件夹public,点击上面的共享,选择everyone
2、在virtual box设备处 安装 增强功能,然后要重启
3、在设备除设置共享文件,选择其他,从电脑选那个public 共享文件
4、终端挂载
Sudo mkdir /mnt/share
Sudo mount -t vboxsf public /mnt/share
5、设置自动挂载
修改/etc/fstab的内容
Sudo vi /etc/fstab //拥有修改权限
添加内容
Public /mnt/share vboxsf rw,gid=100,uid=1000,auto 0 0
以:w!写入退出
Wq 保存
(2) 另一个问题,在虚拟机上面,解压rar 文件,发现出现错误,然后用不了那个可执行文件。其实这个是因为确实这解压功能的软件,然后去终端安装了rar 和unrar 这连个软件后,就可以正常解压了。
(3) 当执行那个可执行文件时,发现,权限不够,得去修改那个可执行文件的权限属性,我觉得应该是,这个可执行文件不是gcc本身编译出来的,所以刚开始处理跟以前不大一样。
一、分析源代码
从c语言代码可以看到,首先输入一个串,然后传参给phase_1函数
二、查看汇编代码
调用phase1前的栈帧
此出是主函数调用了phase_1(),建立了新的栈帧
把数据移入栈
把 0x804115c移入 esp的上一个存到单元
把 main函数的第一个参数,input 移到当前esp栈顶
调用字符串比较函数
调用字符串比较函数后,建立新的栈帧
从这里可以看到,先读取0x8(p),即 input这个值 到ebx
同理把 0x804115c 读到esi那里,然后进行比较
最后把判断结果保存在eax,如果等0,就结束,否则就调用爆炸函数
由于这个,字符串函数比较的功能,就是,当相同返回0,不相同返回1,现在要为0跳过爆炸,所以我们的输入,input 就是要跟地址0x804115c相同
这个就涉及到,查看内存地址的值,用x/s addr 命令可以查看
由此可以看到该地址的内容是一个字符串
关于内存查看,有相关资料
gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式
x/ (n,f,u为可选参数)
n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义
f:显示格式
x(hex) 按十六进制格式显示变量。
d(decimal) 按十进制格式显示变量。
u(unsigned decimal) 按十进制格式显示无符号整型。
o(octal) 按八进制格式显示变量。
t(binary) 按二进制格式显示变量。
a(address) 按十六进制格式显示变量。
c(char) 按字符格式显示变量。
f(float) 按浮点数格式显示变量
u:每个单元的大小,按字节数来计算。默认是4 bytes。GDB会从指定内存地址开始读取指定字节,并把其当作一个值取出来,并使用格式f来显示
b:1 byte h:2 bytes w:4 bytes g:8 bytes
比如x/3uh 0x54320表示从内存地址0x54320读取内容,h表示以双字节为单位,3表示输出3个单位,u表示按照十六进制显示。
从上面:我们知道,我们调用字符串比较时,我们的输入存储在eax寄存器里面
于是我设断点查看
本以为,eax存储的是1,然而不是
后来发现,eax只是存了那个串的首地址
换个方式查看,确实是存了1
当然,输入"We have to stand with our North Korean allies."这个串,就过第一关了。