PicoCTF Writeup - General Skills

olefty

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}

阅读 928
1 声望
0 粉丝
0 条评论
你知道吗?

1 声望
0 粉丝
文章目录
宣传栏