iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
Security

資訊安全的美味雜炊系列 第 20

[Day20] - Rev 0x5 linux逆逆實戰

  • 分享至 

  • xImage
  •  

Day20 - Rev 0x5 linux逆逆實戰

前言

  • 昨天介紹了逆向的觀念和一些工具,今天來實際來逆向一些binaryㄅ
  • 想要跟真打的建議先自行試試看,打不出來再往下看

題目

  • 來自:https://hackme.inndy.tw/scoreboard/
    • reversing 系列題目

解題環境

  • 解題時需要linux機器(筆者使用的是VirtualBox)搭配Ubuntu,方便測試與執行
  • 有錢的話也可以上網租一台linux server

:::danger
用最新版的Ubuntu20.04 LTS,有些32-bits binary會無法執行,請注意
:::

helloworld

  • Guess a number please :D
  • 先試試看用file指令觀察資訊
    • 32-bit
    • dynamically linked
    • not stripped
  • 用用逆向工具ghidra,看看逆出來的高階語言作分析
    • 通常第一步都會觀察main function,逆出來的source code如下
      • 程式會先scanf存到local_18裡,若local_18 = 0x12b9b0a1,則會對local_35做處理接著print出來
    • 於是將binary拿來執行,把0x12b9b0a1換成十進位接著輸入,flag就被print出來了
      • 0x12b9b0a1 = 314159265

simple

  • A little bit harder
  • file
    • 32-bit
    • dynamically linked
    • not stripped
  • 一樣看一下main,可以針對該變數改名Rename Variable
  • main
    • 變得清楚明瞭,會將buffer中的值+1,接著做字串比對
    • 因此將UIJT.JT.ZPVS.GMBH的每個ascii值-1,作比對之後就得知值是多少
    • 利用python寫一個簡單的script
    • 接著輸入

accumulator

  • Reverse this for the flag
  • file
    • 64-bit
    • dynamically linked
    • stripped
  • function名稱被stripped掉了,因此只能一個一個找
    • 發現FUN_00400710蠻可疑的,來分析一下
  • 整理一下邏輯
    • 會將輸入的字串,透過SHA512加密之後,透過FUN_004008c0function做檢查,若檢查成功,則puts("Good flag for you.")
    • 於是我們觀察FUN_004008c0
      • 合理推斷第一個為字串的arr,第二個應該為長度
    • 將function改一下變數名稱,整理個邏輯
      • 能找出下列邏輯
      arr[0] = DATA[0]
      //已經融合再v3_中,
      arr[1] + arr[0] = DATA[1]
      arr[2] + arr[1] + arr[0] = DATA[2]
      ....
      
    • 接下來利用小學數學回推
      • 因為arr[0] = DATA[0],用代數轉換就可以全部變為DATA
      arr[0] = DATA[0]
      //已經融合再v3_中,
      arr[1] = DATA[1] - DATA[0]
      arr[2] = DATA[2] - DATA[1] - DATA[0] 
      
    • 將DATA區段全選右鍵,轉成int(從code我們得知為4個byte)
    • copy後,經過sublime處理,再寫python script
      a = [ 0xC3, 0xFF, 0x1ED, 0x248, 0x31F, 0x3A1, 0x3B2, 0x43E, 0x49C, 0x4A0, 0x58D, 0x63B, 0x70D, 0x736, 0x821, 0x910, 0x97E, 0xA2D, 0xAA7, 0xB9C, 0xC8D, 0xD4B, 0xD5A, 0xE41, 0xE80, 0xF6E, 0xF95, 0x1061, 0x1084, 0x112A, 0x11AB, 0x1210, 0x1262, 0x1347, 0x1387, 0x13D0, 0x13F2, 0x14AB, 0x1586, 0x15A0, 0x160C, 0x1677, 0x1769, 0x17E6, 0x17EE, 0x1836, 0x1843, 0x190A, 0x1945, 0x19D1, 0x19F7, 0x1A60, 0x1B42, 0x1B62, 0x1B8D, 0x1BC2, 0x1C6A, 0x1D2C, 0x1D8B, 0x1DF9, 0x1E1A, 0x1F14, 0x1FD2, 0x1FFB, 0x2041, 0x208D, 0x20CE, 0x2115, 0x2190, 0x21C0, 0x21F5, 0x2226, 0x2259, 0x228C, 0x22C5, 0x22F9, 0x232F, 0x2366, 0x2399, 0x23C9, 0x23FF, 0x2465, 0x249E, 0x24D5, 0x250B, 0x2544, 0x2577, 0x25AC, 0x25DC, 0x260D, 0x2640, 0x2676, 0x26D8, 0x270C, 0x273D, 0x27A0, 0x27D3, 0x2806, 0x2836, 0x286E, 0x28A2, 0x28D2, 0x2937, 0x299C, 0x29FE, 0x2A61, 0x2AC2, 0x2B25, 0x2B58, 0x2B8B, 0x2BC2, 0x2C28, 0x2C59, 0x2CBB, 0x2CF3, 0x2D55, 0x2D85, 0x2DE9, 0x2E4C, 0x2E7C, 0x2EAF, 0x2F14, 0x2F49, 0x2F81, 0x2FE3, 0x3048, 0x3079, 0x30AD, 0x3113, 0x3178, 0x31AE, 0x31E7, 0x3217, 0x3279, 0x32AA, 0x32DC, 0x330F, 0x3375, 0x33AB, 0x33DC, 0x343E, 0x346E, 0x34D1, 0x3501, 0x3563, 0x3596, 0x35CB, 0x3631, 0x3694, 0x36CD, 0x3700, 0x3763, 0x37C6, 0x3829, 0x3860, 0x3892, 0x38C3, 0x38F3, 0x3923, 0x3957, 0x398C, 0x39C5, 0x39F8, 0x3A2E, 0x3A67, 0x3ACC, 0x3B32, 0x3B6A, 0x3B9F, 0x3BD2, 0x3C03, 0x3C64, 0x3C95, 0x3CFA, 0x3D32, 0x3D93, 0x3DCA, 0x3E2C, 0x3E60, 0x3E92, 0x3ECB, 0x3F04, 0x3F69, 0x3FA0, 0x4002, 0x403B, 0x409F, 0x40D8, 0x410F, 0x413F, 0x41A1, 0x41DA, 0x423B, 0x426D, 0x42A0, 0x4301, 0x4362, 0x43DF ]
      
      for i in range(1,len(a)):
          print(chr(a[i] - a[i-1]),end='')
      

技術總結

  • 今天透過linux逆向的三個題目,熟悉一下整個逆向的感覺,更進階的逆向可能是連ghidra都逆不出來高階語言,只能看組合語言逆,筆者沒到這個境界,還在持續努力當中

上一篇
[Day19] - Rev 0x4 linux逆逆
下一篇
[Day21] - Crypto 0x1 介紹
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言