INSHACK_ctf_2019

2019-05-07

這場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而不是pwntoolspack