CTFlearn刷题记录

做不出题的挫败感太强了.....前面做中学生CTF平台直接自闭
有的入门题虽然没有wp,但对大佬来说过于简单了也不太好去问,唔
慢慢写吧.....
吐槽一下mega.nz,不代理上不去就算了下载速度还慢,不能保存原图
本来是下了个kali的,最后还是先用Ubuntu当下生产工具

0.无

题库:CTFLearn

一些看到的很好的WP https://github.com/rishitsaiya/CTFlearn-Writeups
https://crazyeights225.github.io

1.Easy

Web

Basic Injection

?这个应该做成easy的第一题吗
先跟着他给的那个lab学更佳
打开环境,输入万能密码 flag' or '1' =1 就可以找到flag了
然后就是做出的最后一道web了
flagCTFlearn{th4t_is_why_you_n33d_to_sanitiz3_inputs}

Crypto

Character Encoding

扔到一个16进制的编码里面,然后解码出来
flagABCTF{45C11_15_U53FUL}

Base 2 2 the 6

根据题意猜一下是base64(2^6)
一般都从基本的尝试起吧
flag CTF{FlaggyWaggyRaggy}

Reverse Polarity

二进制解码
直接扔解密网站里,或者自己写一个
这个用的是8位编码
flagCTF{Bit_Flippin}

Hextroadinary

首先观察名字,猜测是XOR.又因为是给了两个编码结果应该是两者的xor
扔到这个 工具 上去(本地一直编不出来....)
flagflag{0xc0ded}

HyperStream Test #2

不得不说神奇密码真的多
观察题目,出现了bacon与大量AB,判断为培根密码
扔到CyberChef里选bacon就好,需要用一下IJ的互换
flagflag{ILOUEBACONDONTYOU}

Suspecious message

看来得把加解密啃完再来做
下载图片,首先看到的就是qwert,猜测是键盘加密
然后解密出来的格式完全不对,搜了一下,原来这个是Playfair加密
给出的photo也是常用的key格式(一下就被qwert吸引了)
在线工具
flag CTFLEARN{PL4YF41R_1S_C00L_C1PHERRRR}

Tone dialing

下载下来是一个音频文件,结合题意应该是电话拨号音
然后就了解到了 DTMN 这个类型
没看懂如何实现的,先找一个 在线网站 扔进去
得到了一串数字,2个一组转ascii码试试
flag CTFlearn{CRYPTOGRAPHY}

Misc

Wikipedia

虽然是看了评论才知道大概意思,但不得不说这个趣味程度真的好强...
依照题目意思,首先进英文版的wikipedia,然后搜索在贡献那里选择使用IP搜索贡献者
跳出来一个15年8月对flag词条的修改,点进去尝试寻找
最后得到了flag
www
wwwww
flagflag{cNi76bV2IVERlh97hP}

My Friend John

简单的压缩包密码爆破与字典的运用
一开始不知道hint是啥,瞎搞,后来根据评论的提示说是John The Ripper
是一个很有名的密码爆破软件,linux下的又是kail自带,结果自己在Ubuntu下尝试安装了好久都无功而返
因为zip2john一直报错,也不知道怎么解决,Stack Overflow上的几个都试过了结果一个permission denied一个OpenSSL headers not found
最后还是回windows下用ARCHPR
总之根据第一次解压得到的压缩包名字提示use-rockyou,猜测是要我们去用rockyou字典进行爆破
解压过后使用里面给的第二个字典custom-list再次爆破
出来第三个是brute-force-pin是让我们暴力破解,但是可以直接用rockyou过掉
最后解出来的flag.txt就是flag了
flag CTFlearn{s0_n0W_y0uv3_M3t_J0hN}
捏嘛安装依赖卡半天还要怕update导致挂了

Forensics

Snowboard

这题要是给个hint会更好
简单的图片隐写,直接记事本打开,flag直接就第一行CTFlearn{CTFIsEasy!!!}
aaa
提交,wrong answer,关闭浏览器!
接着观察内容,发现第二行有个以 == 结尾的字符串,直接b64
真flag CTFlearn{SkiBanff}

PikesPeak

和上面一样的障眼法
同样直接记事本打开,发现flag前面就给了几个
2222
当然最简单的方式是直接全部交一遍
根据题意,让我们注意字符串,观察平常交flag的地方的格式 CTFlearn{xxxxx} 因此找到flag也是遵循同样大小写规则的 flag CTFlearn{Gandalf}

Simple Steganography

简单的提取图片中的隐藏文件
一开始看错了hint以为是StegSlove结果是Steghide,不过也正好都能用到
尝试直接使用Steghide提取,发现需要密码.使用记事本打开/Stegslove提取信息/exiftool获取字段信息,找到疑似密码myadmin
22323232
mm
带密码提取,输出了一个txt文件,打开后使用b64转码得到flag
flag CTFlearn{this_is_fun}

PDF by fdpumyp

啊,怎么一些常用的软件都是Linux就有
windows版本的 stings在这里下
总之就用strings命令搜索文件里全部的ascii字符,找到个很像的扔到b64解码就ok
找到的结果 external:Q1RGbGVhcm57KV8xbDB3M3kwVW0wMG15MTIzfQ==
flag CTFlearn{)_1l0w3y0Um00my123}

Gandalf.BilboBaggins

记事本打开,发现前面有三行类似b64的东西
发现只解出来了第一个
CTFlearn{xor_is_your_friend}
交上去不对,于是尝试把后两个xor一下,最后得到flag

import base64

s1 = "Q1RGbGVhcm57eG9yX2lzX3lvdXJfZnJpZW5kfQo="
s2 = "xD6kfO2UrE5SnLQ6WgESK4kvD/Y/rDJPXNU45k/p"
s3 = "h2riEIj13iAp29VUPmB+TadtZppdw3AuO7JRiDyU"
flag = ''
print(base64.b64decode(s1))
s2 = base64.b64decode(s2)
s3 = base64.b64decode(s3)
for i, j in zip(s2, s3):
    flag += chr(i ^ j)
print(flag)

flag CTFlearn{Gandalf.BilboBaggins}

Blank Page

下载文件直接打开,发现一片空白,尝试CtrlA发现可以选中字符
因此猜测使用了零宽度字符(就QQ昵称空白那种) 一些类别
扔pyc里发现零宽度字符都是RLM类,然后也掺杂了不少普通的空格,猜测是替换成01的二进制字符串
把RLM都替换成1,普通空格替换成0(反正不行就反过来),可以扔到之前wechall里那个ascii解码器里,也可以手搓一下

a = "那一大串01"
for i in range(0,len(a),8):
    print(chr(int(a[i:i+8],2)),end="")

解密出来是段文字,flag在最底下

From The Global Anti-Terrorists Tactics

If you read this you passed. Congrats.
Your first task will come tomorrow.
Good luck.

CTFlearn{If_y0u_r3/\d_thi5_you_pa553d}

abandoned place

下载图片后打开,感觉就是个正常的jpg风景图片
使用Steghide和Stegslove都无果
请出 winhex
打开文件后首先CtrlF搜索flag观察文件头和文件尾,并无异样(给自己贴一下常见的文件头尾)
flag{there's_nothing}
然后就一筹莫展了
回去看题目提示,发现说flag在图片外面..
查看图片是2016:900的,回winhex找FFC0,把高改成和宽一样的16进制编码07E0
w
2
(jpg编码相关的可以看这篇文章里提到的另一篇文章)
另存为新图片打开后可以得到flag(原图过大超过了试用版的200kb保存所以找绿化版用吧233)
a
flag CTFlearn{urban_exploration}

TUX!

很简单的题但我还没上手kail所以不会(
把图片下载下来之后拖winhex里,肉眼一下发现504B0304(zip,或者直接搜PK碰碰),把这部分代码剪贴到winhex文件里然后另存为zip文件
人肉搜索
打开提示需要密码,再扔到stegsolve里提取下字符
ICAgIC AgUGFzc3 dvcmQ6IE xpbnV4MT IzNDUK. base64后得到 Password: Linux12345
输进去得到flag CTFlearn{Linux_Is_Awesome}
如果是用kail或者其他的linux系统,总之直接用binwalk提取下zip就可以了
(用stegsolve提取字符的时候发现直接把最后面的ziphex提取出来了,早知道就可以不用肉体识别了)

I'm a dump

下载文件使用hex查看器查看,搜索ctflearn即可
CTFlearnH{fl4ggyfHEHUHEl4g}H
根据题目提示把H.E.H.U.H.E.几个去掉即可
最后得到flagCTFlearn{fl4ggyfl4g}
按照下面的解释好像是要在linux下打开,还没试过
而且winhex好像复制老是出现奇奇怪怪的问题

试着搜了下file文件,找到个比较好用的网站https://filext.com/zh/
最后直接用用linux下的strings就好了

Minions

我要点名批评一个傻卵网盘,挂代理才上去还下载慢有的时候还要锁ip
先进入题目中提供的链接下载图片,使用strings或者winhex啥的都行,可以找到下一张图片的下载地址然后你就会因为锁ip要等不等长的时间才能下载了
下载之后再次尝试使用strings会得到个提示YouWon(Almost).jpg
这之后先去搜题解了,然后是用binwalk看看里面有没有个压缩包,解压再下一步
不过我还不会binwalk,先用winhex肉眼鉴52617221Rar开头的,复制到新文件中去保存解压,找到第二个img
再使用strings找到CTF{VmtaU1IxUXhUbFZSYXpsV1RWUnNRMVpYZEZkYWJFWTJVVmhrVlZGVU1Eaz0=)
再根据hint和结尾符号扔到b64里多次解密(cyberchef这个做的蛮好的,output的时候还会给个提示让你接着解密下去)
4次后得到结果M1NI0NS_ARE_C00L,记得吧包裹flag的换成ctflearn

下面是binwalk的初次尝试

官网
非kali的可以通过sudo apt install binwalk下载,会连带下不少依赖的样子
输入binwalk Only_Few_Steps.jpg可以看到里面有一个rar文件,加上-e参数提取出来里面的文件
可以获得一个新的压缩包,剩下就和上面步骤一致了
好多功能要慢慢熟悉下啊

RE

Basic Android RE 1

入门的RE(第一次做.....)
使用dex2jar反编译一下apk(就是把apk里的dex变成可读jar)
然后用jd-gui打开下生成的jar(还没学会smail语法和使用jeb.....虽然java也不会)
跳到MainActivity,观察一下下面的函数(因为是入门所以不太会语法也能看懂啥意思)

大概意思是读入输入的字符,转化为md5吗,然后和给定的md5码比较,如果相同则返回一条信息,格式为Success! CTFlearn{****_is_not_secure!}
因此把给的那个md5码扔到解密网站上就行
flag CTFlearn{Spring2019_is_not_secure!}

Reykjavik

第一道正式点的RE
下载附件发现zip里面带了三个文件,一个加密了的zip(没搞懂),一个二进制文件(Reykjavik)和readme
把Reykjavik扔到ida里去,窗口模式直接给出了大致逻辑
总之遇事不决ida
大致逻辑为按照输入的判断是不是flag(直接给了个最简单的flag,其实是错的),那么大概就只用看中间这段用于判断的代码了
idayyds
意思为把data``qword_4018这些都与0xAB异或一下,拼装起来后与输入比较即可
F5一下查看反汇编出来的源代码也好理解,注意是x86使用了小端序
找到一个大佬直接用GDB动态调试

F5出来的
int __cdecl main(int argc, const char **argv, const char **envp)
{
  const char *v3; // rbp
  int v4; // er12
  __int64 v6[3]; // [rsp+0h] [rbp-38h] BYREF
  char v7; // [rsp+18h] [rbp-20h]
  char v8; // [rsp+19h] [rbp-1Fh]
  char v9; // [rsp+1Ah] [rbp-1Eh]
  char v10; // [rsp+1Bh] [rbp-1Dh]

  if ( argc == 1 )
  {
    v4 = 1;
    puts("Usage: Reykjavik CTFlearn{flag}");
  }
  else
  {
    v3 = argv[1];
    __printf_chk(1LL, "Welcome to the CTFlearn Reversing Challenge Reykjavik v2: %s\n", v3);
    puts("Compile Options: ${CMAKE_CXX_FLAGS} -O0 -fno-stack-protector -mno-sse\n");
    if ( !strcmp(v3, "CTFlearn{Is_This_A_False_Flag?}") )
    {
      v4 = 2;
      __printf_chk(1LL, "You found the false flag Dude!:'%s'\n\n", "CTFlearn{Is_This_A_False_Flag?}");
    }
    else
    {
      v10 = 0;
      v6[0] = data ^ 0xABABABABABABABABLL;
      v6[2] = qword_4020 ^ 0xABABABABABABABABLL;
      v6[1] = qword_4018 ^ 0xABABABABABABABABLL;
      v7 = byte_4028 ^ 0xAB;
      v8 = byte_4029 ^ 0xAB;
      v9 = byte_402A ^ 0xAB;
      v4 = strcmp((const char *)v6, v3);
      if ( v4 )
      {
        v4 = 4;
        __printf_chk(1LL, "Sorry Dude, '%s' is not the flag :-(\n\n", v3);
      }
      else
      {
        __printf_chk(1LL, "Congratulations, you found the flag!!: '%s'\n\n", (const char *)v6);
      }
    }
  }
  return v4;
}
#这部分的代码是抄的大佬的https://blog.csdn.net/qq_33976344/article/details/112737625
#还没学懂汇编看得有些晕就直接放大佬写的代码了
#比如反汇编出来的代码没咋看懂为啥比较的只是v6但却把v789的都要加上
data = [0xC5, 0xD9, 0xCA, 0xCE, 0xC7, 0xED, 0xFF, 0xE8]
qword_4018 = [0xDD, 0x9B, 0xE7, 0xF4, 0xCE, 0xD2, 0xEE, 0xD0]
qword_4020 = [0xC5, 0xCA, 0xC7, 0xCE, 0xC8, 0xE2, 0xF4, 0xCE]
byte_4028 = 0xCF
byte_4029 = 0xF4
byte_402A = 0xD6

XOR_val = 0xAB

flag = ''
flag1 = ''
flag2 = ''
flag3 = ''
for i in data:
    flag1 += chr(i ^ XOR_val)

for i in qword_4018:
    flag2 += chr(i ^ XOR_val)

for i in qword_4020:
    flag3 += chr(i ^ XOR_val)
flag += flag1[::-1] + flag2[::-1] + flag3[::-1] + chr(byte_4028 ^ XOR_val) + chr(byte_4029 ^ XOR_val) + chr(byte_402A ^ XOR_val)

print(flag)

flag CTFlearn{Eye_L0ve_Iceland_}

其实不太理解为啥要拼接v6v7v8v9v10,明明strcmp只比较了v3v6,搜到的wp都是直接用GDB的动态调试
上面的解释代码也是抄的,如果不包括后面三个的话其实也能拼凑出来
用了下Ghidra,看到相关的部分确实是这样的
汇编里比较的时候会从给定的地址开始一直往下比较直到遇到结束符,由于上面的部分分配地址的时候是连续的所以比较v6(rbp-38h)就会一直到v10(rbq-1Dh)
加之是x86是小端序的所以多字节要倒序输入

Ramada

和Reykjavik一致,拖到IDA里后看CheckFlag函数

__int64 __fastcall CheckFlag(const char *a1)
{
  __int64 i; // rax

  for ( i = 0LL; i != 21; ++i )
  {
    if ( *((_DWORD *)&data + i) != a1[i] * a1[i] * a1[i] )
    {
      puts("No flag for you!");
      return 4LL;
    }
  }
  return 0LL;
}

其中data在InitData函数处进行了初始化(IDA要自己对照值就找了Ghidra的了)


/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* InitData() */

void InitData(void)

{
  data._80_4_ = 0x1734eb;
  data._0_4_ = 0x13693;
  data._4_4_ = 0x6b2c0;
  data._8_4_ = 0x11a9f9;
  data._12_4_ = 0x157000;
  data._16_4_ = 0x1cb91;
  data._20_4_ = 0x1bb528;
  data._24_4_ = 0x1bb528;
  data._28_4_ = 0xded21;
  data._32_4_ = 0x144f38;
  data._36_4_ = 0xfb89d;
  data._40_4_ = 0x169b48;
  data._44_4_ = 0xd151f;
  data._48_4_ = 0x8b98b;
  data._52_4_ = 0x17d140;
  data._56_4_ = 0xded21;
  data._60_4_ = 0x1338c0;
  data._64_4_ = 0x1338c0;
  data._68_4_ = 0x11a9f9;
  data._72_4_ = 0x1b000;
  data._76_4_ = 0x144f38;
  return;
}

逻辑就是根据输入的CTFLearn{xxxxx}的xxx和data里的字段进行比较,方式是x*x*x==data[i]
总之跑一下结果

data = [ 0x13693, 0x6b2c0,0x11a9f9,0x157000, 0x1cb91,0x1bb528,0x1bb528,0xded21,
         0x144f38,0xfb89d, 0x169b48,0xd151f,0x8b98b,0x17d140,0xded21,0x1338c0,
         0x1338c0,0x11a9f9,0x1b000,0x144f38,0x1734eb]
flag = ""
for i in data :
    flag += chr(round(int(i)**(1/3)))
print(flag)

flag CTFLearn{+Lip1zzaner_Stalli0ns}

Binary

Simple bof

第一道pwn题然后华丽搁浅
下载附件然后根据secret == 0x67616c66得到获取flag的方法
总之就是试,因为gets会导致溢出,然后这里又直接可视化了内存的值情况
这里也给出了根据不同的情况的反馈,让调试更加方便了
当试到48个字符的时候,提示可以开始操控了,就把secret的值flag传到最后面去gets进去(因为栈是FILO的)
总之就是x*48flag即可
flag CTFlearn{buffer_0verflows_4re_c00l!}

2.Medium

Web

POST Practice

上来就是一道Medium里的入门题
对POST的基本了解与使用,打开网页后F12可以看到user和password
当然你主动使用postman之类的也可以在返回的结果里看到
总之携带上就好了
注意格式为form-data
user=&password=的形式
flag CTFlearn{p0st_d4t4_4ll_d4y}

unfinished

准备迁移到Github上去

posted @   FPICZEIT  阅读(772)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示