這場CTF打得好開心XD, 有不少水題解出來,分享一下
打完才發現資料夾名稱取錯了,算了就將錯就錯吧
intergover
這題就是個問答題,這支程式只會給你兩種種回答
用checksec
去看他,發現有開Canary,所以應該不是overflow
用r2
去看他,發現程式很單純,只要答對就給你Flag了:
進去看main,第一個是判斷是不是整數的if條件式
第二個就是我們要的,判斷是不是正確數字的if條件式
0xf2
轉10進位就是242,所以….
因為這是pwn題,但我們在本機跑的,所以出現這個就算成功了
signed_or_not_signed
這一題跟剛剛的intergover
有幾分相似
可以看到他多了一個數值的確認,太大他會寫too big
r2他,看一些比較重要的if條件式
這一個是判斷數字是否太大的條件式,可以看到當我們輸入的值大於10就會說太大了
另外要特別注意
movzx eax, ax
mov edi, eax
movzx是什麼呢?
從這一行可以知道,他把我輸入的值以short int
的型別傳入vuln的function裡面
然後在vuln裡面做判定是否為正確數字的條件判斷:
這邊也可以看出他以short int
的型別進行判斷
mov eax, edi
mov word [local_4h], ax
cmp word [local_4h], 0xfd66
他將vuln的參數放進eax內,然後把eax的後16 bits拿去做cmp,
阿因為前面movzx
也會把前16 bits用0蓋過去,所以結果不影響,
然後根據資料型態
所以我們的數字最大就是65535
, 0xfd66 = 64870 但這個數字大於10,沒辦法用
因此可以用2補數的特性
解決
64870 = 65535 = -666, 所以答案就是-666
Overcobol
這題是給你cobol的source code,但我看不懂cobol QQ,所以研究了一下就把它complie 成elf來執行
用r2進去看還是看不出所以然,所以就直接進去執行了,做法就是,產一個gadget,然後看他哪個地方會overflow,
libcob: module 'iaaajaaa' not found
代表可以注入,
我們嘗試讓他用 SYSTEM
的module
成功了!他可以執行command!
所以接著只要把command not found那一段改成/bin/sh
就可以成功執行我們的shell
可以利用Linux無視/
個數的特性去補完中間所需的padding
最後payload: baaacaaa/////bin//////////////shSYSTEM
ropberry
執行的樣子:
然後他可以被overflow
看一下checksec 和 got table
可以看到他開了NX
,然後是static的方式compile的
這個情況下可以嘗試使用ROPgadget
來產rop chain
產出來的結果:
這一段是他發現程式內可以使用的gadget
這一段是他發現的一些比較關鍵的gadget
這一段是產出來的ropchain, 也是我們想要的東西
把他複製下來貼到我們的exploit code上
擷取部分 exploit code:
要注意的是,pwntools
的module要在struct
之上,因為pwntools也會用到pack
這個字
那這就跟struct
的有衝突到了,這邊我們要的是struct
的pack而不是pwntools
的pack