Question5: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)

Writeup:

连接过后拿到一份源码

passcodepwn1

login()里面对两个passcode输入是有问题的。但是一时又不知道如何利用。

仔细分析第一次在welcome()里面的输入,输入的字符串是函数内的局部变量,当函数调用结束,这个变量就会失去价值,变为栈里的残留数据。那我们能不能通过控制这个残留的数据来影响到login()当中的passcode呢?

接下来用edb加载程序查看一下堆栈情况。
我们首先运行到输入passcode1的位置
pass01

passcode1随便输入一个值,然后scanf会将未初始化的passcode1的值作为一个地址去寻址,这里程序多半会挂,我们看这时的栈空间。
pass00

这时程序已经挂了,原因是不能访问0xf75becab这个地址。
在图中我们可以看到0xff9acb88是之前welcome()里输入数据的残留。而0xff9acbe8这里就是passcode1的地址,它们中间的偏移值是0x60 = 96。算上一个32位的地址占用4个字节。刚好能满足96 + 4 = 100,即name[]的占用空间。

能操控passcode1里的数据后我们就能往任意地址写入4字节的数据。
方便起见,这里选择往fflush()的GOT表里面写入登陆成功那段代码的地址。这样在输入passcode1后,紧跟着就能执行登录成功代码拿到flag。

所以进IDA查了一下GOT表信息,找到了fflush()的GOT表地址
pass03

然后是查看loginOK那段代码的地址
pass02

这里往GOT表写0x080485d7或者0x080485e3都是可以的,因为我本地调试的时候想要个回显,所以我写的是0x080485d7(0x080485d7=134514135)

根据以上写出payload


pass04