ret2libc3
前提知识plt表:存放jmp *(函数got表)等指令即jmp got表中的值在编译阶段就确定且只会加载libc中被调用的函数got表存放函数的虚拟地址在libc中的函数被首次执行才会将虚拟地址加载到got表对程序的作用相当于libc函数的缓存延迟绑定页表用于转换虚拟地址和物理地址伪代码偏移shiftf12都看看——gets函数偏移0x6c字符串发现libc.so.6使用linux的where指令看一下so的位置注意一下64和32位plt表发现puts或者printf函数——可以泄露got地址得到system函数的虚拟地址没有/bin/sh——使用plt表中的gets函数写入可写的地址0x0804b000且附近正好有bss地址那为了不破坏数据就选0x0804A0400x200既然要泄露got表的地址那么要泄露哪个地址呢一般选用__libc_start_main函数原因是got表并不是在编译阶段就固定的而是在程序执行后函数被首次调用才会被加载到got表中而__libc_start_main函数一定会被调用一个小知识当一个程序运行时会有一下几个步骤1操作系统加载动态链接器动态链接器再跳转到程序的_start2程序中的_start函数会去调用libc中的__libc_start_main函数3libc中的__libc_start_main函数会调用main函数——————————————————————————————__libc_start_main函数linux系统执行main函数前完成一系列初始工程如进程的栈堆等编写脚本:tipsELF中的symbols如果是编译后的程序得到的是虚拟地址而如果是libc这种动态的得到的就是偏移如果是gets函数推荐使用sendline函数当使用rop构造多条payload时在发送payload前使用p.recvuntil(b)接收一下数据防止程序还未执行到输入函数