萌新带你开车上p站(三)
本文作者:萌新
前情回顾:
0x08
题目给的提示是和运算符优先级有关

登录后直接看源码
mistake@pwnable:~$ ls
flag mistake mistake.c password
mistake@pwnable:~$ cat mistake.c
#include <stdio.h>
#include <fcntl.h>
#define PW_LEN 10
#define XORKEY 1
void xor(char* s, int len){
int i;
for(i=0; i<len; i++){
s[i] ^= XORKEY;
}
}
int main(int argc, char* argv[]){
int fd;
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
printf("do not bruteforce...\n");
sleep(time(0)%20);
char pw_buf[PW_LEN+1];
int len;
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
printf("read error\n");
close(fd);
return 0;
}
char pw_buf2[PW_LEN+1];
printf("input password : ");
scanf("%10s", pw_buf2);
// xor your input
xor(pw_buf2, 10);
if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
printf("Password OK\n");
system("/bin/cat flag\n");
}
else{
printf("Wrong Password\n");
}
close(fd);
return 0;
}
看关键:
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.。。。。
其实就是简单的二分法
编程
import time
from pwn import *
conn = remote('0', 9007)
conn.recv(10000)
for _ in range(100)://猜100次
line = conn.recv(1024).decode('UTF-8').strip().split(' ')
print(line)
n = int(line[0].split('=')[1])//读出给的n,c
c = int(line[1].split('=')[1])
left = 0
right = n//共n个硬币
for _ in range(c)://二分法猜解
guess = ' '.join(str(left) for left in range(left, int((left+right)/2)))
conn.sendline(guess)//给出需要猜测的货币
output = int(conn.recv(1024).decode('UTF-8').strip())//读取返回称重的结果
if (output % 10 == 0)://整除10的情况
left = int((left+right)/2)
else://不整除的情况
right = int((left+right)/ 2)
conn.sendline(str(left))
print(conn.recv(1024).decode('UTF-8'))//打印一轮的结果
print(conn.recv(1024).decode('UTF-8'))
conn.close()
以上一关的shellshock登录服务器,在tmp目录下新建一个python 脚本
按照提示
用pwntools编写的时候,注意remote(‘0’,9007)
执行如下


0x11 blackjack

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

这里会校验我们输入的金额
如果比cash大则会报错,并要求再次输入
不过再次输入的时候不会报错了
考虑到要赚够1000000,而输的几率比较大
我们可以输入-的金额,比如-1000000,只要输了就可以拿到flag

然后选择y就打印出flag了

萌新带你开车上p站(三)的更多相关文章
- 萌新带你开车上p站(二)
本文作者:萌新 前情提要:萌新带你开车上p站(一) 0x04flag 看题目描述似乎是一个和脱壳相关的逆向题目 按照给出的地址先下载过来 file看看 是个可执行文件 执行之 emm什么都看不出来, ...
- 萌新带你开车上p站(Ⅳ)
本文作者:萌新 前情回顾: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 萌新带你开车上P站(三) 回顾一下前篇,我们开始新的内容吧 0x12 登录后看源码 通读程序,逻辑是这样子的: 输入6个 ...
- 萌新带你开车上p站(一)
本文作者:萌新 0x01前言 这一系列文章为pwnable.krToddlr’s Bottle的全部题解,其中有三道题目相对而言稍难或者说比较经典,单独成篇,其他题目的题解放在一起发出来. 0x02f ...
- 萌新带你开车上p站(番外篇)
本文由“合天智汇”公众号首发,作者:萌新 前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程 ...
- 萌新带你开车上p站(终极番外)
本文由“合天智汇”公众号首发,作者:萌新 0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数原型.IO重定向.文 ...
- 萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...
- 大数据萌新的Python学习之路(三)
笔记内容: 一.集合及其运算 在之列表中我们可以存储数据,并且对数据进行各种各样的操作.但是如果我们想要对数据进行去重时是十分麻烦的,需要使用循环,要建立新的列表,还要 进行对比,十分的麻烦,还消耗 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)
萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...
- 留学萌新Essay写作须知
Essay是留学生们接触比较多的一项留学生作业,但尽管如此,依旧有部分同学对于essay写作是没有足够的把握的.随着开学季的到来,很多萌新初次接触Essay写作,难免会有很多不懂得地方.所以今天小编就 ...
随机推荐
- SQL常见错误总结
目录 语法错误 标点错漏 重命名 数据拼接 null值 逻辑顺序 函数错误 参数的数量 参数的格式 逻辑错误 数据重复 无效筛选 标签重叠 时间错位 SQL是数据分析中最高频的操作之一,本文梳理常见的 ...
- [C++]请麻烦压一下定理的棺材板啦
从去年还在竞赛的时候2/12的原博客里搬运来的 不得不说之前取名真的很艺术qwq 今天开始上的数论课,让头发以肉眼可见的速度掉落emmm 没关系我头发多我不怕啦啦啦QwQ 其中最令人头疼的就是那些人名 ...
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
- Stress-induced changes in the S-palmitoylation and S-nitrosylation of synaptic proteins (解读人:陈凌云)
文献名:Stress-induced changes in the S-palmitoylation and S-nitrosylation of synaptic proteins (压力诱导突触蛋 ...
- jQuery的简单用法(jQuery的简介,选择器,属性和css,文档处理)
一.jQuery简介 1.1. JS库 JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互客户端页面, 并且兼容各大浏览器. 1.2. 当前流行的 JavaSc ...
- Red Team 工具集之网络钓鱼和水坑攻击
来自:信安之路(微信号:xazlsec),作者:myh0st 参考项目:https://github.com/infosecn1nja/Red-Teaming-Toolkit 上图是一个 Red Te ...
- shell编程之循环语句
for #! /bin/sh for FRUIT in apple banana pear; do echo "I like $FRUIT" done while #! /bin/ ...
- Codeforce219C-Color Stripe
E. Color Stripe time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- pd库dataframe基本操作
一.查看数据(查看对象的方法对于Series来说同样适用) 1.查看DataFrame前xx行或后xx行 a=DataFrame(data); a.head(6)表示显示前6行数据,若head()中不 ...
- linux execl()函数 关于execl()函数族的用法不在赘述,
linux execl()函数 关于execl()函数族的用法不在赘述, linux 网络编程 1---(基本概念) 1.TCP和UDP协议 共同点:同为传输层协议 不同点: TCP:有连接,可靠 U ...