本文作者:萌新

前情回顾:

萌新带你开车上p站(一)

萌新带你开车上p站(二)

0x08


题目给的提示是和运算符优先级有关

登录后直接看源码

  1. mistake@pwnable:~$ ls
  2.  
  3. flag mistake mistake.c password
  4.  
  5. mistake@pwnable:~$ cat mistake.c
  6.  
  7. #include <stdio.h>
  8.  
  9. #include <fcntl.h>
  10.  
  11. #define PW_LEN 10
  12.  
  13. #define XORKEY 1
  14.  
  15. void xor(char* s, int len){
  16.  
  17. int i;
  18.  
  19. for(i=0; i<len; i++){
  20.  
  21. s[i] ^= XORKEY;
  22.  
  23. }
  24.  
  25. }
  26.  
  27. int main(int argc, char* argv[]){
  28.  
  29. int fd;
  30.  
  31. if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
  32.  
  33. printf("can't open password %d\n", fd);
  34.  
  35. return 0;
  36.  
  37. }
  38.  
  39. printf("do not bruteforce...\n");
  40.  
  41. sleep(time(0)%20);
  42.  
  43. char pw_buf[PW_LEN+1];
  44.  
  45. int len;
  46.  
  47. if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
  48.  
  49. printf("read error\n");
  50.  
  51. close(fd);
  52.  
  53. return 0;
  54.  
  55. }
  56.  
  57. char pw_buf2[PW_LEN+1];
  58.  
  59. printf("input password : ");
  60.  
  61. scanf("%10s", pw_buf2);
  62.  
  63. // xor your input
  64.  
  65. xor(pw_buf2, 10);
  66.  
  67. if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
  68.  
  69. printf("Password OK\n");
  70.  
  71. system("/bin/cat flag\n");
  72.  
  73. }
  74.  
  75. else{
  76.  
  77. printf("Wrong Password\n");
  78.  
  79. }
  80.  
  81. close(fd);
  82.  
  83. return 0;
  84.  
  85. }

看关键:

main调用的xor函数:

将长度给len的字符串与1异或

main中的主要逻辑

从/home/mistake/password读10个字节数据放到pw_buf,我们手动输入10字节数据放在pw_buf2,如果pw_buf2与1异或的结果如果与pw_buf相等,则打印flag

那么关键就是pw_buf的数据,先直接读password看看

没有权限

题目的提示是和运算符优先级有关

我们仔细分析源码,看看问题出在哪里

问题在这里

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){

open函数里权限检查是没问题的,O_RDONLY表示以只读方式打开

0400表示文件所有者具有可读取的权限

由于权限通过检查,所以open函数返回值为0

有因为0<0不成立

所有比较结果为0

然后赋值给fd

即fd为0,表示标准输入,也就是说fd现在是我们可控的

结合之前分析,pw_buf也为我们控制

那就很简单了

第一次输入10个1,存入pw_buf

第二次输入10个0,存入pw_buf2,与1异或后覆盖pw_buf2,此时buf2的值也为10个1,满足打印flag的逻辑

0x09shellshock


查看权限

可以看到shellshock程序的所属组的权限位上有s,表示sgid,也就是说在执行shellshock时,用户将获得shellshcok所属组的权限,即执行shellshock后将获得root所在用户组的权限,而由flag这一行的权限位可知,该权限可以读取flag

这一点从源码中也可以看出来

getegid()返回进程执行有效组识别码。在这里getegid()返回的就是root所在用户组的id

setresuid用于设置ruid,euid,seuid,在这里就是统统都设置为进程当前的egid

setresgid用于设置rgid,egid,sgid,这里也是统统设置为进程当前的egid

因为s标志,所以egid实际上是root所在用户组的id

再根据题目提示的shellshock

这是著名的bash破壳漏洞

直接在网上找到poc修改下即可

解释一下发生了什么

首先在当前环境下定义了X函数,函数体由{}括起来,然后在函数体外加了一条额外的语句/bin/cat ./flag即打印flag的命令,这条语句会在后面执行./shellshock时被调用,由于执行shellshock时会有root权限,所以自然就有权限来打印flag了

想知道怎么操作吗?点击开始实践——破壳漏洞实践http://www.hetianlab.com/expc.do?ec=ECID172.19.105.222014092915250400001

0x10


按照要求连接服务器

这是一个小游戏

大意是一堆货币里有真币假币,两者重量不同,真币10g,假币9g。给你N个硬币,C次机会,让你猜哪一个是假币。需要在30s的时间里才对100次。

这题其实考的是算法。

分治法解决

举个例子。

一共100个硬币,其中1个是假的,先称重1-49,如果结果整除10,则假币在50-100.

第二轮称50-75,如果不整除10,则假币在其中

第三轮称50-62.。。。。

其实就是简单的二分法

编程

  1. import time
  2.  
  3. from pwn import *
  4.  
  5. conn = remote('0', 9007)
  6.  
  7. conn.recv(10000)
  8.  
  9. for _ in range(100)://猜100次
  10.  
  11. line = conn.recv(1024).decode('UTF-8').strip().split(' ')
  12.  
  13. print(line)
  14.  
  15. n = int(line[0].split('=')[1])//读出给的n,c
  16.  
  17. c = int(line[1].split('=')[1])
  18.  
  19. left = 0
  20.  
  21. right = n//共n个硬币
  22.  
  23. for _ in range(c)://二分法猜解
  24.  
  25. guess = ' '.join(str(left) for left in range(left, int((left+right)/2)))
  26.  
  27. conn.sendline(guess)//给出需要猜测的货币
  28.  
  29. output = int(conn.recv(1024).decode('UTF-8').strip())//读取返回称重的结果
  30.  
  31. if (output % 10 == 0)://整除10的情况
  32.  
  33. left = int((left+right)/2)
  34.  
  35. else://不整除的情况
  36.  
  37. right = int((left+right)/ 2)
  38.  
  39. conn.sendline(str(left))
  40.  
  41. print(conn.recv(1024).decode('UTF-8'))//打印一轮的结果
  42.  
  43. print(conn.recv(1024).decode('UTF-8'))
  44.  
  45. conn.close()

以上一关的shellshock登录服务器,在tmp目录下新建一个python 脚本

按照提示

用pwntools编写的时候,注意remote(‘0’,9007)

执行如下

0x11 blackjack


em...源码有点长,直接看关键部分

这里会校验我们输入的金额

如果比cash大则会报错,并要求再次输入

不过再次输入的时候不会报错了

考虑到要赚够1000000,而输的几率比较大

我们可以输入-的金额,比如-1000000,只要输了就可以拿到flag

然后选择y就打印出flag了

萌新带你开车上p站(三)的更多相关文章

  1. 萌新带你开车上p站(二)

    本文作者:萌新 前情提要:萌新带你开车上p站(一) 0x04flag  看题目描述似乎是一个和脱壳相关的逆向题目 按照给出的地址先下载过来 file看看 是个可执行文件 执行之 emm什么都看不出来, ...

  2. 萌新带你开车上p站(Ⅳ)

    本文作者:萌新 前情回顾: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 萌新带你开车上P站(三) 回顾一下前篇,我们开始新的内容吧 0x12 登录后看源码 通读程序,逻辑是这样子的: 输入6个 ...

  3. 萌新带你开车上p站(一)

    本文作者:萌新 0x01前言 这一系列文章为pwnable.krToddlr’s Bottle的全部题解,其中有三道题目相对而言稍难或者说比较经典,单独成篇,其他题目的题解放在一起发出来. 0x02f ...

  4. 萌新带你开车上p站(番外篇)

    本文由“合天智汇”公众号首发,作者:萌新 前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程 ...

  5. 萌新带你开车上p站(终极番外)

    本文由“合天智汇”公众号首发,作者:萌新 0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数原型.IO重定向.文 ...

  6. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  7. 大数据萌新的Python学习之路(三)

    笔记内容:  一.集合及其运算 在之列表中我们可以存储数据,并且对数据进行各种各样的操作.但是如果我们想要对数据进行去重时是十分麻烦的,需要使用循环,要建立新的列表,还要 进行对比,十分的麻烦,还消耗 ...

  8. 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

    萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...

  9. 留学萌新Essay写作须知

    Essay是留学生们接触比较多的一项留学生作业,但尽管如此,依旧有部分同学对于essay写作是没有足够的把握的.随着开学季的到来,很多萌新初次接触Essay写作,难免会有很多不懂得地方.所以今天小编就 ...

随机推荐

  1. 五分钟了解Consul

    Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像.比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册),有 ...

  2. 搭建XSS测试平台

    XSS测试平台是测试XSS漏洞获取cookie并接收web页面的平台,XSS可以做js能做的所有事情,包括但不限于窃取cookie,后台增删文章.钓鱼.利用xss漏洞进行传播.修改网页代码.网站重定向 ...

  3. Fiddler4 手机抓包

    1.要对计算机Fiddler进行配置,允许远程计算机连接. 2.保证手机电脑在同一局域网中. 3.手机上设置代理服务器.以华为手机为例,设置-->WLAN-->找到并长按目前所连接的WiF ...

  4. 2020年PHP 面试问题(二)

    一.什么是 CGI?什么是 FastCGI?php-fpm,FastCGI,Nginx 之间是什么关系? CGI,通用网关接口,用于WEB服务器和应用程序间的交互,定义输入输出规范,用户的请求通过WE ...

  5. 如何使用 electron 屏幕或摄像头录制并保存到本地

    思路分析 通过 electron desktopCapturer 和 navigator 获取要进行录制的媒体源信息: 使用 MediaRecorder 对视频流进行录制: 将 MediaRecord ...

  6. python快速入门基础知识

    1.变量赋值与语句 #python 不需要手动指定变量类型.不需要分号 #To assign the value 365 to the variable days,we enter the varia ...

  7. TensorFlow 安装官方教程:Ubuntu 安装,Mac OS X 安装,Windows 安装

    从我的使用体验来看  Ubuntu 是最好的, Mac 没有显卡,后期跑大项目比较鸡肋,Windows 安装各种依赖各种坑.Ubuntu 安装 TensorFlow 方便,后面安装  TensorFl ...

  8. TensorFlow系列专题(七):一文综述RNN循环神经网络

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 前言 RNN知识结构 简单循环神经网络 RNN的基本结构 RNN的运算过程 ...

  9. 科普 | ​生成对抗网络(GAN)的发展史

    来源:https://en.wikipedia.org/wiki/Edmond_de_Belamy 五年前,Generative Adversarial Networks(GANs)在深度学习领域掀起 ...

  10. Selenium系列(十四) - Web UI 自动化基础实战(1)

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...