PicoCTF Writeup - General Skills
Posted olefty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PicoCTF Writeup - General Skills相关的知识,希望对你有一定的参考价值。
PicoCTF是由卡耐基梅隆大学创办的面向中学生的CTF赛事,题目难度较低,非常适合像我这样的菜鸡入门。题目分为General Skills,Binary Exploitation,Reverse Engineering,Web Exploitation,Cryptography和Forensics六个部分,除了部分二进制题目外,flag的格式都是picoCTF{xxx}
。
Genral Skills
这部分顾名思义是对基础知识的考查,涉及各种编码知识和Shell命令,总分1900。
- Lets Warm Up | 50 points
如果我告诉你一个以十六进制0x70开头的单词,它在ASCII编码中将以什么开头?
人生苦短,我用python:
$ python
>>> chr(0x70)
\'p\'
Flag:picoCTF{p}
- Warmed Up | 50 points
十六进制数0x3D在十进制中是多少?
$ python
>>> 0x3D
61
Flag:picoCTF{61}
- 2Warm | 50 points
你能否将十进制数字42转换为二进制?
$ python
>>> bin(42)
\'0b101010\'
Flag:picoCTF{101010}
- what\'s a net cat? | 100 points
使用netcat(nc)将非常重要。你可以连接到jupiter.challenges.picoctf.org的64287端口来获取flag吗?
nc号称网络安全界的瑞士军刀,最简单的用法就是连接到某台主机的某个端口进行数据读写:
$ nc jupiter.challenges.picoctf.org 64287
You\'re on your way to becoming the net cat master
picoCTF{nEtCat_Mast3ry_284be8f7}
Flag:picoCTF{nEtCat_Mast3ry_284be8f7}
- strings it | 100 points
你能在不运行file的情况下找到flag吗?
在强烈好奇心驱使下,我还是尝试运行了文件:
$ file strings
strings: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=047a5079a5f563cd0e540d28f42a37161093ffda, not stripped
$ chmod +x strings && ./strings
Maybe try the \'strings\' function? Take a look at the man page
根据提示执行man strings
可以看到strings命令的具体用法,该命令用于输出二进制文件中的可打印字符:
$ strings strings | grep picoCTF
picoCTF{5tRIng5_1T_827aee91}
Flag:picoCTF{5tRIng5_1T_827aee91}
- Bases | 100 points
bDNhcm5fdGgzX3IwcDM1
是什么意思?我认为跟base(编码)有关。
根据细(ti)致(mu)观(miao)察(shu)尝试对字符串进行base64解码:
$ echo bDNhcm5fdGgzX3IwcDM1 | base64 -d
l3arn_th3_r0p35
Flag:picoCTF{l3arn_th3_r0p35}
- First Grep | 100 points
你可以在file中找到flag吗?手动浏览确实很乏味,直觉告诉我有更好的方法。
$ grep picoCTF file
picoCTF{grep_is_good_to_find_things_dba08a45}
Flag:picoCTF{grep_is_good_to_find_things_dba08a45}
- Based | 200 points
要真正成为1337,你必须了解不同的数据编码,例如十六进制或二进制。你可以从该程序中获得flag来证明你即将成为1337吗?使用nc jupiter.challenges.picoctf.org 29221连接。
1337是leet的黑客语写法,可以理解成大牛的意思。nc到远程主机后是一个交互式程序,需要在规定时间内把给出的字符串进行ASCII编码,一共三道题:
$ nc jupiter.challenges.picoctf.org 29221
Let us see how data is stored
chair
Please give the 01100011 01101000 01100001 01101001 01110010 as a word.
...
you have 45 seconds.....
Input:
chair
Please give me the 156 165 162 163 145 as a word.
Input:
nurse
Please give me the 6e75727365 as a word.
Input:
nurse
You\'ve beaten the challenge
Flag: picoCTF{learning_about_converting_values_00a975ff}
注意第一题输出里已经给了答案。手速快的童鞋可以直接开一个python解释器手撸:
$ python
>>> chr(0o156)
\'n\'
>>> chr(0o165)
\'u\'
>>> chr(0o162)
\'r\'
>>> chr(0o163)
\'s\'
>>> chr(0o145)
\'e\'
>>> bytes.fromhex(\'6e75727365\')
b\'nurse\'
或者写自动脚本来完成,我觉得有点杀鸡用牛刀,再加上对自己单身二十年的手速有自信就没写。
Flag:picoCTF{learning_about_converting_values_00a975ff}
- plumbing | 200 points
有时你需要处理文件输出的数据。你能找到保留此程序的输出并搜索flag的方法吗?连接到jupiter.challenges.picoctf.org 7480。
直接连接会有大量意义不明的输出,需要用管道过滤一下:
$ nc jupiter.challenges.picoctf.org 7480 | grep picoCTF
picoCTF{digital_plumb3r_06e9d954}
Flag:picoCTF{digital_plumb3r_06e9d954}
- mus1c | 300 points
我给你写了一首song。将其放入picoCTF {}标志格式。
这里需要参考提示:
Do you think you can master rockstar?
google了一下rockstar居然在GitHub上找到个名为RockstarLang的编程语言,用摇滚歌曲歌词的方式来写代码可太浪漫了2333。项目首页上能看到很多版本的转译器,用来把rockstar源码转换成其他语言。亲测rocketstar-py有bug,推荐使用kaiser-ruby(依赖pry):
$ gem install kaiser-ruby pry
安装完成后运行song文件:
$ kaiser-ruby execute lyrics.txt
114
114
114
111
99
107
110
114
110
48
49
49
51
114
将输出转换为ASCII编码:
$ python
>>> \'\'\'114
... 114
... 114
... 111
... 99
... 107
... 110
... 114
... 110
... 48
... 49
... 49
... 51
... 114
... \'\'\'.strip().split(\'\\n\')
[\'114\', \'114\', \'114\', \'111\', \'99\', \'107\', \'110\', \'114\', \'110\', \'48\', \'49\', \'49\', \'51\', \'114\']
>>> \'\'.join(map(chr,map(int,_)))
\'rrrocknrn0113r\'
Flag:picoCTF{rrrocknrn0113r}
- flag_shop | 300 points
这有一家flag的商店,你能买到flag吗? Source。用nc jupiter.challenges.picoctf.org 4906
连接。
连接上去是一个类似文字冒险游戏的交互式程序,输入数字选择功能。初始金额1100,可以购买任意数量的普通flag和1337flag,普通flag花费900,1337flag花费100000。审计源码发现开销使用的是有符号整数,意味着可以将其溢出变为负数,从而使余额不降反升。计算一下溢出所需的普通flag数量:
$ python
>>> (2147483647+1100)//900+1
2386095
实际操作过程如下:
$ nc jupiter.challenges.picoctf.org 4906
Welcome to the flag exchange
We sell flags
1. Check Account Balance
2. Buy Flags
3. Exit
Enter a menu selection
2
Currently for sale
1. Defintely not the flag Flag
2. 1337 Flag
1
These knockoff Flags cost 900 each, enter desired quantity
2386095
The final cost is: -2147481796
Your current balance after transaction: 2147482896
Welcome to the flag exchange
We sell flags
1. Check Account Balance
2. Buy Flags
3. Exit
Enter a menu selection
2
Currently for sale
1. Defintely not the flag Flag
2. 1337 Flag
2
1337 flags cost 100000 dollars, and we only have 1 in stock
Enter 1 to buy one1
YOUR FLAG IS: picoCTF{m0n3y_bag5_9c5fac9b}
Welcome to the flag exchange
We sell flags
1. Check Account Balance
2. Buy Flags
3. Exit
Enter a menu selection
Flag:picoCTF{m0n3y_bag5_9c5fac9b}
- 1_wanna_b3_a_r0ck5tar | 350 points
我给你写了另一首song。将flag放进picoCTF {}标志格式。
直接老方法运行的话不会得到任何输出,这次我们将其转换为ruby代码一探究竟:
$ kaiser-ruby transpile lyrics.txt
@rocknroll = true
@silence = false
@a_guitar = 19
@tommy = 44
@music = 160
print \'> \'
__input = $stdin.gets.chomp
@the_music = Float(__input) rescue __input
if @the_music == @a_guitar
puts ("Keep on rocking!").to_s
print \'> \'
__input = $stdin.gets.chomp
@the_rhythm = Float(__input) rescue __input
if @the_rhythm - @music == nil
@tommy = 66
puts (@tommy).to_s
@music = 79
@jamming = 78
puts (@music).to_s
puts (@jamming).to_s
@tommy = 74
puts (@tommy).to_s
@tommy = 79
puts (@tommy).to_s
@rock = 86
puts (@rock).to_s
@tommy = 73
puts (@tommy).to_s
break
puts ("Bring on the rock!").to_s
else
break
end
end
代码中能看到一系列有规律的赋值语句,将右侧的值转换为ASCII编码即可得到flag。
Flag:picoCTF{BONJOVI}
以上是关于PicoCTF Writeup - General Skills的主要内容,如果未能解决你的问题,请参考以下文章
python 来自picoCTF 2018的Desrouleaux挑战解决方案。