菜鸡首发 CTF || 部分 WriteUp & 学习经验

靠着神通广大的群友关系()混进了 HIT 的 CTF 队招新比赛,学到了很多姿势和 pwn 经验,故在此记录一下。

萌新菜鸡首发 CTF,题目比较简单,而且还没有 AK,神犇请自觉绕步(

还有 %%%%%% rxz mcfx

 


 

 

 

以上程序都可以在 ctf1pack 下载到~

 


  • 环境准备

首先我们需要一台 Windows (用来运行一些工具,比如 IDA010Editor 等),和一台 Linux(用来写脚本)。我使用的是 Windows10 x64 + Ubuntu 18.04 amd64。

首先我们需要在 Ubuntu 上装一些好用的工具,python3 是肯定得先搞上的

然后我们装上万能的 pwntools

再装上调试神器 gdb-peda

接着装上 ROPgadget

继续安装 binwalk 及 foremost

最后安装 requests 和 gmpy2(pycryptodome)~~~

 

 

 


  • pwn – game

玩石头剪刀布,赢 100 次拿到 flag。

观察源代码,发现种子是 time(0)%10 ,即只要得到相同的 time 则后面随机生成的数都是可以算出来的。

这样就能做到稳赢 100 次了

然而再敲一个 C艹 来实现这个过程是非常令人崩溃的,这时候 python3 + pwntools 就是绝配了!

短短几行过后,我们成功拿到了 flag

 

 

 


  • pwn – pwn-1-3-1

只有一个 LSB 文件,打开 IDA 把它扔进去

发现 buf 只有 256byte,而 read 一下读了 0x200uLL 进来,是个典型的缓冲区溢出。

同时在函数列表中发现 get_flag(),一个 F5 下去看看

意思就是只要控制程序执行到 get_flag() 就可以成功拿到 flag

用 checksec 等查看程序的信息

发现启用了 NX(DEP),所以无法插入 shellcode,故使用 ROP 类方法。

同时发现没有开 PIE(非 ASLR),所以可以直接插函数地址进去。

在 IDA 里找到导出函数的地址:

然后使用 gdb-peda 找到使缓冲区溢出至 $RSP(溢出时指向 $RIP) 需要的字节数

于是直接覆盖 $RSP ($RIP)至 get_flag() 的函数地址,就可以拿到 flag 了!

 

 

 


  • pwn – pwn-1-3-1-1

同样,拿到 ELF 64-bit LSB executable 后直接扔进 IDA 并且 F5

这个 main() 好像没啥区别,同样进入 get_flag()

发现这个函数现在带了个参数,而且还得通过 validate() 的验证

然而这个验证实际上没啥用((,因为我们想要的 flag 在 ./flag 处

所以现在的问题是如何使程序执行到 get_flag() ,并带个参数 path=”./flag” ?

这里需要注意的是 x86 下函数的参数传递完全靠的是从右到左的栈操作,而 amd64 下参数的传递首先靠的是 $RDI、$RSI、$RDX、$RCX、$R8、$R9 这六个寄存器,存满了才开始用栈操作。

所以要控制 get_flag() 中的第一个参数 path,就是要控制 $RDI。

使用 ROPgadget 查找 pop rdi; ret 的操作,拿来做 gadget。

成功找到 pop rdi; ret,在 0x0000000000400903 处

注意,pop rdi 仅是把堆栈中字符串的地址 pop 到 $RDI,所以我们需要有一块内存区域存放字符串 “./flag”

而幸运的是,程序里自带了这个字符串

$RSP 在 ret 后从指向 $RIP(被修改为 pop rdi; ret 的地址)上移,并且执行 pop 后继续上移到了新的 $RIP(被修改为 get_flag() 的地址),而后执行 ret 并转跳执行。

最后根据 pwn-1-3-1 的方法找出溢出 offset,就可以构造 exploit 了

 

 

 


  • misc – Yankee with no brim

拿到手是这样一张图片

尝试用 StegSolve 查找 LSB 隐写,查找特殊字符串,均无果

于是用 binwalk 查找特殊文件头

发现里面还藏了张 png,遂用 foremost 提取出来

然而这张 png 打开也没啥特殊的(Windows 受害者来了)

经过网上搜索资料(场外支援www)发现可以通过修改 PNG 图像的宽/高来达到隐藏文字的效果,这在 Linux 下查看时会报错

用 010Editor 打开此 PNG,分析结构,将代表 height 的数字随意调大一些

就拿到了 flag

 

 

 


  • crypto – 申必base64

给了经过自定义码表加密的 cipher.txt 以及明文 plain.txt

然后硬着头皮去学了学 base64 是咋加密的(

因为 base64 加密的过程只是在码表里对应位置查某一字符的 hash 值,所以把 base64 加解密的代码抄下来改改就可以拿到 flag 了

(因为代码都是抄的所以码风及其混乱www)

 

 

 


  • crypto – RSA-1

给了个 rsa-1.py

也是硬着头皮去学了学 RSA 加密,发现比预计的简单一点((

虽然这里有 p q r 三个质数,但是 e d n 加解密那一套还是通用的,毕竟没有用到 CRT(笑

直接解密即可

 

 

 


  • 尾言

不得不说萌新的第一次 CTF 经历对咱启发还是挺大的qwq

除了 web 那部分感觉比较简单,其他题都是对咱萌新菜鸡的挑战qqq

不仅学到了挺多东西,同时还混水混到了 Rank#5 (((

%%%%%%%%%%%%% rxz mcfx woshiluo Ciel QAQAutoMaton 以及其他所有群友

是我太菜了就对了(还有三道题做不出来(

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注