WaniCTF 2023 writeupではなく、自分用メモ

# 後で勉強した問題

## beg_for_a_peg

なんで、これやってなかったんだろ？　楽勝じゃん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/9b2add68-0c30-4a32-d570-e031a35a3fb7.png)


## lowkey_messedup
今まで活躍してくれてた「usb_pcap.py」が動かず、すぐにあきらめてしまっていた。
力技でも解けるパケット数だったが、「それは最後の手段」と後回しにしてたら、加齢による記憶喪失で忘れてた。

usb_pcap.pyが動かなかった原因は、切り出すべきデータの判定場所が今まで扱ったことがあるpcapと違っていた。

キー情報ありのパケット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/d6393ac2-1741-0c48-5a0c-9b5cfadf087c.png)

キー情報なしのパケット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/f9b12dee-1042-23d1-071b-f4bf9d912512.png)

本データでは、16バイト目を使うべきであった。

```python:usb_pcap.pyの一部
    pcap = rdpcap("chall.pcap")
    usb_data = []
    for pkt in pcap:
        buf = pkt['Raw'].load
        #if buf[22] == '\x01':　　　　　#以前動いてた
        if buf[16] == '\x01':           #今回はこっち
            usb_data.append(buf[27:])
    return usb_data
```


## screenshot

提供されたjsからわかる、しばり

```javascript
      if (!req.query.url.includes("http") || req.query.url.includes("file")) {
        res.status(400).send("Bad Request");
        return;
      }
```

全てに気づかなかった
・file://でアクセスすると、Bad Requestになるところを、FILE://にすれば突破できること
・httpを含めるために # （フラグメント識別子）を使うこと→存在しない識別子があってもエラーにならず無視される
・file://flag.txtだと相対パス中のflag.txtで、file:///flag.txtとすると絶対パスとなること

正解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/07ac2714-b4d4-a22c-52f1-92ce63b767c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/c69f1537-207e-5dbe-a1ea-9a94c89113c7.png)

なお、FILE://../../../../../../../flag.txt#httpがInternal Errorになる理由がわからない


## Extract Service 1
これは、officeファイルの拡張子をzipに変えて、中のリンクを変えて/flagを取ろうとしてどつぼにはまった。

一時、burp使って、

```
------WebKitFormBoundaryCxg4BQjmtLSWyhx6
Content-Disposition: form-data; name="target"

word/document.xml
------WebKitFormBoundaryCxg4BQjmtLSWyhx6--
```
を
```
------WebKitFormBoundaryCxg4BQjmtLSWyhx6
Content-Disposition: form-data; name="target"

/flag
------WebKitFormBoundaryCxg4BQjmtLSWyhx6--
```
に変えたけど、
`../../../../../../../flag`
にすれば通ることに気づかなかった。

失敗例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/cf5658da-3d34-fd86-4613-40ae0132de3a.png)

成功例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/28da1836-833c-cc47-74e6-259cec85b30b.png)


# 解けた問題

## IndexedDB
Burp Suite で記録するだけ

## 64bps
たぶん64bpsに制限してるので、応答にものづごく時間がかかる。

```
dd if=/dev/random of=2gb.txt bs=1M count=2048
cat flag.txt >> 2gb.txt
rm flag.txt
```

フラグは尻についてるので、ピンポイントでGetする。
そのためには、サイズが必要なので、Burp Suiteを使ってGETをHEADに変えてアクセス。
サイズが2147483697とわかるので分割ダウンロード

```
$ curl -r 2147483638-2147483697 https://64bps-web.wanictf.org/2gb.txt -o flag.txt
```

## Just_Passw0rd
サクラエディタでフラグがとれる

## javersing
JADXでデコンパイルすると、

```java
for (int i = 0; i < 30; i++) {
    if (replace.charAt((i * 7) % 30) != "Fcn_yDlvaGpj_Logi}eias{iaeAm_s".charAt(i)) { 
       z = false;
    }
}

```

が見える。

あとは並べ替えるだけ。

```python
enc = ["F","c","n","_","y","D","l","v","a","G","p","j","_","L","o","g","i","}","e","i","a","s","{","i","a","e","A","m","_","s"]
ans = enc

for i in range(30):
    ans[( i * 7 ) % 30] = enc[i]

for i in range(30):
    print(ans[i],end="")
```


## fermat
elfなので、まず、ghidraする

flagはここにある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/4bbce905-f8c3-d365-036a-18f6050f737d.png)

 以前ならGhidraスクリプト書いてたが、加齢により、書けなくなった。

xrefで呼び出し元であるmain関数に戻るとcheck関数が見えた。

```c:check
  if (((param_1 < 3) || (param_2 < 3)) || (param_3 < 3)) {
    uVar1 = 0;
  }
  else {
    if (param_1 * param_1 * param_1 + param_2 * param_2 * param_2 == param_3 * param_3 * param_3) {
      uVar1 = 1;
    }
    else {
      uVar1 = 0;
    }
```

そんな都合のいい数値ないよ。
gdbでcheck関数の戻り値を書き換えて、flagを表示させる系の問題か。


```:フラグを得るまでのgdbコマンド
# ./fermat
Input a> 1
Input b> 1
Input c> 1
(a, b, c) = (1, 1, 1)
Invalid value :(

## gdb ./fermat 

gdb-peda$ b main
gdb-peda$ r
gdb-peda$ pdisass main
gdb-peda$ b *0x00005555555554c5
gdb-peda$ c
Input a> 1
Input b> 1
Input c> 1
(a, b, c) = (1, 1, 1)
Breakpoint 2, 0x00005555555554c5 in main ()
gdb-peda$ set $rax=0x1
gdb-peda$ c
Continuing.
wow :o
FLAG{you_need_a_lot_of_time_and_effort_to_solve_reversing_208b47bd66c2cd8}
```

## 01. netcat
ncするだけ

## 02. only once

```
  int score = 0, chall = 1;
  char buf[8];
```

チェレンジ回数１回なのに３問正解しないといけない。
バッファオーバーフローでチャレンジ回数を増やす。

```
$ nc only-once-pwn.wanictf.org 9002

+---------------------------------------+
| your score: 0, remaining 1 challenges |
+---------------------------------------+

753 + 729 = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
Oops...

（略）

FLAG{y0u_4r3_600d_47_c41cu14710n5!}
```

## EZDORSA_Lv1
p = 3
q = 5
n = p*q
e = 65535
c ≡ m^e (mod n) ≡ 10 (mod n)
ん？最後の式の右辺の10は答えでは？

## Prompt

ChatGPTみたいな問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/2c16190a-96b5-eb9c-2ecf-b63424509ba2.png)

## Just_mp4
プロパティを見るだけ

## whats_happening
青い空を見上げればいつもそこに白い猫でファイルを切り出すだけ

## theseus
angr問題

```python:angr.py
# coding: UTF-8
#!/usr/bin/env python3
import angr
import logging

logging.getLogger("angr").setLevel("CRITICAL")
angr.manager.l.setLevel("CRITICAL")
proj = angr.Project("./chall")

simgr = proj.factory.simgr()
simgr.explore(find=lambda s: b"Correct!" in s.posix.dumps(1))
if len(simgr.found) > 0:
    found = simgr.found[0].posix.dumps(0).decode("utf-8", "ignore")
    print(found)
```

angrの実行

```
# workon angr
(angr) # python angr.py 
WARNING | 2023-05-05 20:12:23,798 | cle.loader | The main binary is a position-independent executable. It is being loaded with a base address of 0x400000.
FLAG{vKCsq3jl4j_Y0uMade1t}
(angr) # deactivate
#
```