学到的新知识总结
- 管道:符号为
|
前一个进程的输出直接作为后一个进程的输入 - 输出重定向:符号为
>
将内容定向输入到文件中 - perl:一门解释性语言,不需要预编译,直接在命令行中使用。常与输出重定向">"将生成的字符串存储到文件input中。
- xxd:16进制查看命令
- objdump:反汇编
实验过程
1、修改机器指令,改变程序执行流程
首先将目标文件pwn1进行反汇编,能够看到相关的汇编代码。
其中main函数中有一条call指令,后面原本接的是foo函数的起始地址
为了能让程序在执行时直接跳到shellcode,我们需要修改调用foo函数时的机器指令,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。如下图所示
- 执行结果如下:
2、通过构造输入参数,造成BOF攻击
这种攻击主要是通过缓冲区的数据溢出导致原函数的返回地址被Shellcode的起始地址所覆盖。
首先我们需要对程序进行GDB调试,查看输入的字符串到第几个字节会发生溢出。(小端机器)
然后构造一个输入,将Shellcode代码的地址覆盖到相应的位置。这时需要用到perl指令。如图
执行结果如下:
3、注入Shellcode并执行
-
准备工作如下:
设置堆栈可执行 execstack -s 设置堆栈可执行
execstack -q 查询文件的堆栈是否可执行
-
关闭地址随机化
more /proc/sys/kernel/randomize_va_space 2
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space 0
-
常用的构造攻击buf的方法
retaddr+nop+shellcode (缓冲区小)
nop+shellcode+retaddr (缓冲区大)
实验首先类似上一个实验构造一个输入,然后用gdb进行调试,对foo函数进行反汇编,在ret指令处设置断点,等待程序继续运行时查看ESP中的值。(一开始按照老师的教程走了一遍,发现原来还有坑,心塞)
ESP的值+4就是Shellcode的地址,再将其写入一开始的攻击buf,执行程序就能攻击成功。
4、老师问题
- NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
- JNE:条件转移指令,如果不相等则跳转。(机器码:75)
- JE:条件转移指令,如果相等则跳转。(机器码:74)
- JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
-
实验感想
- 我觉得这次实验对于我来说还是挺难的吧,第三个实验的细节还有待琢磨,虽然能按照步骤达成最终的目的,但是得把过程细化,理清思路才行。堆栈的结构还有地址的存储还有待加强理解。