Jarvis OJ BASIC 部分WriteUp

0x01base64?

GUYDIMZVGQ2DMN3CGRQTONJXGM3TINLGG42DGMZXGM3TINLGGY4DGNBXGYZTGNLGGY3DGNBWMU3WI===

很明显这不是base64,base32decode一下得到一串16进制

504354467b4a7573745f743373745f683476335f66346e7d
s=b'504354467b4a7573745f743373745f683476335f66346e7d'.decode("hex")
for i in s:
    print i
得到flag PCTF{Just_t3st_h4v3_f4n}

0x02关于USS Lab.

USS的英文全称是什么,请全部小写并使用下划线连接_,并在外面加上PCTF{}之后提交
百度得到flag PCTF{ubiquitous_system_security}

0x03veryeasy

使用基本命令获取flag

用HXD打开搜索PCTF得到flag

PCTF{strings_i5_3asy_isnt_i7}

0x04段子

程序猿圈子里有个非常著名的段子:
手持两把锟斤拷,口中疾呼烫烫烫。
请提交其中"锟斤拷"的十六进制编码。(大写)
FLAG: PCTF{你的答案}

用gbk编码转十六进制输出即可

s='锟斤拷'.decode('utf-8').encode('gbk').encode('hex')
print s.upper()
得到flag PCTF{EFBFBDEFBFBD}

0x05手贱

某天A君的网站被日,管理员密码被改,死活登不上,去数据库一看,啥,这密码md5不是和原来一样吗?为啥登不上咧?
d78b6f302l25cdc811adfe8d4e7c9fd34
请提交PCTF{原来的管理员密码}

计算一下发现这串字符长度为33,然后枚举得到33个长度为32的可疑md5依次查询

s='d78b6f302l25cdc811adfe8d4e7c9fd34'//len(s)==33
for i in range(33):
    print s[0:i]+s[i+1:]
查询md5得到flag PCTF{hack},原来的md5为d78b6f30225cdc811adfe8d4e7c9fd34

注:火眼金睛可以看出d78b6f302l25cdc811adfe8d4e7c9fd34第十个字符为'l'非十六进制字符直接排除即可

0x06美丽的实验室logo

出题人丢下个logo就走了,大家自己看着办吧

丢进Stegsolve ,放Frame Broswer

得到flag PCTF{You_are_R3ally_Car3ful}

0x07神秘的文件

binwalk下可以看到是一个磁盘文件

Linux EXT filesystem, rev 1.0, ext2 filesystem data

用binwalk -e 尝试分离分件得到254个文本文件,打开发现每一个文本文件都有一个字符,推测flag藏在里面写脚本直接获取每一个文本文件的字符

import os
s=""
for i in range(254): #分离得到的文件夹文件名为1~253
    f = open(str(i),'r')
    str1 = f.read()
    s+=str1
print s

得到字符串
Haha ext2 file system is easy, and I know you can easily decompress of it and find the content in it.But the content is spilted in pieces can you make the pieces together. Now this is the flag PCTF{P13c3_7oghter_i7}. The rest is up to you. Cheer up, boy.

很明显flag 为PCTF{P13c3_7oghter_i7}

0x08公倍数

请计算1000000000以内3或5的倍数之和。
如:10以内这样的数有3,5,6,9,和是23
请提交PCTF{你的答案}

直接运算会造成内存溢出,所以只能分段计算

ans = 0 
# for i in range(1000000000):
#   if i%3==0 or i%5==0:
#       ans+=i

n=100000
for i in range(1,10001):
    for j in range((i-1)*n,i*n):
        if j%3==0 or j%5==0:
            ans+=j

print ans
经过几分钟的等待得到flag:PCTF{233333333166666668}

0x09Easy Crackme

这是一个ELF 64-bit 文件,拖进IDA64得到main函数伪代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rdi
  char v5; // [rsp+0h] [rbp-38h]
  char v6; // [rsp+1h] [rbp-37h]
  char v7; // [rsp+2h] [rbp-36h]
  char v8; // [rsp+3h] [rbp-35h]
  char v9; // [rsp+4h] [rbp-34h]
  char v10; // [rsp+5h] [rbp-33h]
  unsigned __int8 v11; // [rsp+10h] [rbp-28h]
  _BYTE v12[7]; // [rsp+11h] [rbp-27h]

  v5 = -85;
  v6 = -35;
  v7 = 51;
  v8 = 84;
  v9 = 53;
  v10 = -17;
  printf((unsigned __int64)"Input your password:");
  _isoc99_scanf((unsigned __int64)"%s");
  if ( strlen((const char *)&v11) == 26 )
  {
    v3 = 0LL;
    if ( (v11 ^ 0xAB) == list1 )
    {
      while ( (v12[v3] ^ (unsigned __int8)*(&v5 + ((signed int)v3 + 1) % 6)) == byte_6B41D1[v3] )
      {
        if ( ++v3 == 25 )
        {
          printf((unsigned __int64)"Congratulations!");
          return 0;
        }
      }
    }
  }
  printf((unsigned __int64)"Password Wrong!! Please try again.");
  return 0;
}
阅读伪代码可以看到flag长度为26,输入的flag需满足第一个字符和0xab异或后得到的字符==某固定字符,剩余的25个字符依次异或==固定字符。
整理出一个固定字符和两个固定字符数组
0xfb
L=[0x9e,0x67,0x12,0x4e,0x9d,0x98,0xab,0x00,0x06,0x46,0x8a,0xf4,0xb4,0x06,0x0b,0x43,0xdc,0xd9,0xa4,0x6c,0x31,0x74,0x9c,0xd2,0xa0]
M=[-85,-35,51,84,53,-17]
分析一波
if ( (v11 ^ 0xAB) == list1 )//v11=list1(0xfb)^0xab
 while ( (v12[v3] ^ (unsigned __int8)*(&v5 + ((signed int)v3 + 1) % 6)) == byte_6B41D1[v3] )
//while(v12[v3]^M[(v3+1)%6]==L[v3])
//即v12[v3]=M[(v3+1)%6]^L[v3]    0<=v3<=25
//flag=v11+v12

OK,直接用C++写代码逆向加密算法

#include <iostream>
#include <string>
using namespace std;
int main(){
    string flag="";
    flag+=char(0xfb^0xab);
    int L[]={0x9e,0x67,0x12,0x4e,0x9d,0x98,0xab,0x00,0x06,0x46,0x8a,0xf4,0xb4,0x06,0x0b,0x43,0xdc,0xd9,0xa4,0x6c,0x31,0x74,0x9c,0xd2,0xa0};
    int M[]={-85,-35,51,84,53,-17};
    for (int i = 0; i < 25; ++i)
    {
        flag+=char(L[i]^M[(i+1)%6]);
    }
    cout<<flag;
}
得到flag PCTF{r3v3Rse_i5_v3ry_eAsy}

0x0a Secret

传说中的签到题
题目入口:http://web.jarvisoj.com:32776/

用postman发送请求在headers->secret发现Welcome_to_phrackCTF_2016

得到flag为 PCTF{Welcome_to_phrackCTF_2016}

0x0b 爱吃培根的出题人

听说你也喜欢吃培根?那我们一起来欣赏一段培根的介绍吧:
bacoN is one of aMerICa'S sWEethEartS. it's A dARlinG, SuCCulEnt fOoD tHAt PaIRs FlawLE
什么,不知道要干什么?上面这段巨丑无比的文字,为什么会有大小写呢?你能发现其中的玄机吗?
提交格式:PCTF{你发现的玄机}

字符串有大小写又因为题目说是培根,尝试将大小写转换为'a','b'

s="bacoN is one of aMerICa'S sWEethEartS. it's A dARlinG, SuCCulEnt fOoD tHAt PaIRs FlawLE"
m1=""
m2=""
for i in s:
    if i.isupper():
        m1+='a'
        m2+='b'
    elif i.islower():
        m1+='b'
        m2+='a'

print m1
print m2

得到两串疑似培根的密文

bbbbabbbbbbbbabbaababaabbbabbbabbbabaabbbaabaabbabbbababaababaababbbaa
aaaabaaaaaaaabaabbababbaaabaaabaaababbaaabbabbaabaaabababbababbabaaabb

排除第一串
尝试将密文解密

aaaabaaaaaaaabaabbababbaaabaaabaaababbaaabbabbaabaaabababbababbabaaabb

培根密码有两种加密方式


培根.jpg
尝试解密
m2='aaaabaaaaaaaabaabbababbaaabaaabaaababbaaabbabbaabaaabababbababbabaaabb'
L=[]
for i in range(len(m2)/5):
    L.append(m2[:5])
    m2=m2[5:]

dir1 = {'aaaaa':'A','aaaab':'B','aaaba':'C','aaabb':'D','aabaa':'E','aabab':'F','aabba':'G','aabbb':'H','abaaa':'I',
        'abaab':'J','ababa':'K','ababb':'L','abbaa':'M','abbab':'N','abbba':'O','abbbb':'P','baaaa':'Q','baaab':'R',
        'baaba':'S','baabb':'T','babaa':'U','babab':'V','babba':'W','babbb':'X','bbaaa':'Y','bbaab':'Z'}

dir2 = {'AAAAA':'a','AABBA':'g','ABBAA':'n','BAABA':'t','AAAAB':'b','AABBB':'h','ABBAB':'o','BAABB':'u/v',
        'AAABA':'c','ABAAA':'i/j','ABBBA':'p','BABAA':'w','AAABB':'d','ABAAB':'k','ABBBB':'q','BABAB':'x',
        'AABAA':'e','ABABA':'l','BAAAA':'r','BABBA':'y','AABAB':'f','ABABB':'m','BAAAB':'s','BABBB':'z'}
flag1=""
flag2=""

for i in L:
    flag1+=str(dir1.get(i.lower()))
    flag2+=str(dir2.get(i.upper()))

print "flag1:%s"%flag1
print "flag2:%s"%flag2

得到明文

flag1:BACNMIRMNSFNND
flag2:baconi/jsnotfood
提交得到最终flag为 PCTF{baconisnotfood}

0x0c veryeasyRSA

已知RSA公钥生成参数:
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
求d =
请提交PCTF{d}

已知p、q、e
那么直接用扩展欧几里得算法可以直接求d咯

######得到Flag PCTF{19178568796155560423675975774142829153827883709027717723363077606260717434369}
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('modular inverse does not exist')
    else:
        return x % m

p = 3487583947589437589237958723892346254777 
q = 8767867843568934765983476584376578389
e = 65537
phi=(p-1)*(q-1)
print modinv(e,phi)
得到flag为PCTF{19178568796155560423675975774142829153827883709027717723363077606260717434369}

0x0d Easy RSA

还记得veryeasy RSA吗?是不是不难?那继续来看看这题吧,这题也不难。
已知一段RSA加密的信息为:0xdc2eeeb2782c且已知加密所用的公钥(N=322831561921859 e = 23)
请解密出明文,提交时请将数字转化为ascii码提交
比如你解出的明文是0x6162,那么请提交字符串ab
提交格式:PCTF{明文字符串}

已知公钥(N,e)
尝试分解N得到
p=13574881 q=23781539
通过扩展欧几里得算法由p、q、e求出私钥(d,e)
密文c=0xdc2eeeb2782c
直接解出明文然后十六进制字符转化为ascii码得到flag

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('modular inverse does not exist')
    else:
        return x % m

c=0xdc2eeeb2782c
N=322831561921859
p=13574881
q=23781539
e=23
phi=(p-1)*(q-1)
d=modinv(e,phi)
print hex(pow(c,d,N))
最终flag为PCTF{3a5Y}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353