iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

我也想成爲好駭客系列 第 4

Day 4 - Unstoppable_ 不要停下來啊

  • 分享至 

  • xImage
  •  

終於開始我們的第一題了(撒花
hint

在這場 CTF 中,它的題目敘述就會是題目的 Hint,那補充說明一下 clone 下來的內容
ls

有漏洞的合約會在圖中的 src 中,而我們解題會用到的合約則是在 test 中,所以我們要做的就是去看 src 中的合約並推斷處它的漏洞,然後修改 test 中的合約內容來使合約達到題目想要的環境

Analyze WTF

把題目的敘述拿下來

There's a tokenized vault with a million DVT tokens deposited. It’s offering flash loans for free, until the grace period ends.

To catch any bugs before going 100% permissionless, the developers decided to run a live beta in testnet. There's a monitoring contract to check liveness of the flashloan feature.

Starting with 10 DVT tokens in balance, show that it's possible to halt the vault. It must stop offering flash loans.

簡單來說,合約在對用戶發放閃電貸款,而我們要做的就是終止合約的進行
contract

那我們可以看到這題的合約一共有兩個
一個是 UnstoppableMonitor.sol 主要是負責提供整個服務的金庫
一個是 UnstoppableVault.sol 主要是負責整個閃電貸的進行

以這一題來講,基本上我們要關注的只有 UnstoppableVault.sol 這個合約,因為我們要動的不是合約的金庫,而是針對合約的進行,在啃過這個合約以後,我們發現了一些有問題的地方
function

以這個合約中的 function 可以看到它閃電貸的通過條件如下:

  1. amount 參數不可以為 0
  2. 閃電貸借貸的貨幣必須是合約金庫的的代幣,像這個挑戰中的是 DVT
  3. convertToShares(totalSupply) 要等於 balanceBefore

前面兩個非常好理解,就是防止空帳戶導致報錯以及統一貨幣,但是第三點就非常耐人尋味了
我們可以在 /damn-vulnerable-defi/lib/solmate/src/tokens 這個路徑下找到合約 import 進來的 ERC4626.sol( 感謝 Ching367436 大大救援 )
convert

這張圖中可以看到這個 function 會計算出 Shares,簡單來說它會通過驗證合約內外部的狀態是否一致,以確保 totalSupply 轉化的借貸金額跟金庫中的實際金額一致,也就說我們要終止合約的話,只要給他一個不正常的狀態就可以做到

solve WTF

至於怎麼給一個不正常的狀態,由於它閃電貸的運作是基於借貸金額與金庫的一致,那就給它不一致,就可以讓他停了
那要修改合約的話,我們就要到 damn-vulnerable-defi/test/unstoppable 中的 Unstoppable.t.sol 來做修改,其中有一個專門讓你寫 sol 的地方
sol

那要怎麼打破平衡呢?
我們只要偷偷 D 直接從合約金庫塞一個 DVT 進來,兩邊就不平衡了

function test_unstoppable() public checkSolvedByPlayer {
    require(token.transfer(address(vault), 1));
}

然後我們可以 test 看看
forge test --mp Unstoppable.t.sol
pass

附上一個沒有通過的截圖
no_pass

還有一位路過停不下來的朋友
unstop


上一篇
Day 3 - Damn Vulnerable DeFi
下一篇
Day 5 - Naive receiver_兄弟你太天真了
系列文
我也想成爲好駭客30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言