1. 程式人生 > >170921 逆向-成信CTF平臺(ReverseMe&CLAZZ)

170921 逆向-成信CTF平臺(ReverseMe&CLAZZ)

1625-5 王子昂 總結《2017年9月21日》 【連續第354天總結】
A. Syclover成信CTF練習平臺-RE
B.

ReverseMe

開啟是一個elf檔案,執行報段錯誤
通過gdb除錯發現錯誤出現在sub_400646的puts函式處

拖入IDA反編譯:

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  __int64 result; // [email protected]
  __int64 v4; // [email protected]
  char v5; // [sp+10h] [bp-10h]@4
__int64 v6; // [sp+18h] [bp-8h]@1 v6 = *MK_FP(__FS__, 40LL); if ( a1 != 3 && (unsigned int)sub_400646((__int64)a2) )// 驗證引數 { puts("Keep thinking!"); result = 0LL; } else { printf("Please input your password(5 words):", a2, a2);// 檢查password __isoc99_scanf("%5s", &v5); if
( (unsigned int)sub_400755((__int64)&v5) == 1 ) { printf("Good Job!\nThe password:%s", &v5); result = 0LL; } else { puts("Wrong!"); result = 0LL; } } v4 = *MK_FP(__FS__, 40LL) ^ v6; return result; }

我們知道,main的三個引數分別為argc, argc, env
很明顯a1即argc沒有被反編譯出來,但是我們知道數量要等於3,即需要附加兩個引數(第一個引數為檔案路徑)
因此在未輸入足夠引數的時候puts的引數自動跳到了後邊env造成溢位

sub_400646的內容很簡單,直接將兩個引數分別與字串對比,寫個指令碼跑出來是“l1nux”和”crack“

驗證完引數後對照password,檢視sub_400755:

__int64 __usercall sub_400755@<rax>(__int64 a1@<rax>)
{
  __int64 result; // [email protected]

  if ( *(_BYTE *)a1 + *(_BYTE *)(a1 + 4) != 106 || *(_BYTE *)a1 != 73 )// 1=73;5=33
  {
    result = 0LL;
  }
  else if ( *(_BYTE *)(a1 + 1) == 76 )          // 2=76
  {
    result = *(_BYTE *)(a1 + 2) + *(_BYTE *)(a1 + 3) == 137 && *(_BYTE *)(a1 + 3) == 70;// 4=70;3=67
  }
  else
  {
    result = 0LL;
  }
  return result;
}

稍微有點意思的驗證,不過簡單加減法就能得到5個ASCII:“ILCF!”

最後flag按提示拼接:flag{l1nux_crack_ILCF!}

CLAZZ

down下來發現無殼,C++寫的exe
直接執行提示輸入password

題目提示是C++的類

IDA反編譯的結構還是比較凌亂的,找不到main函式,直接搜尋字串”plz input your flag”找到了sub_43A1C0

int sub_43A1C0()
{
  char v1; // [sp-4h] [bp-210h]@1
  int v2; // [sp+Ch] [bp-200h]@1
  LPVOID v3; // [sp+14h] [bp-1F8h]@1
  int v4; // [sp+20h] [bp-1ECh]@4
  int v5; // [sp+ECh] [bp-120h]@1
  char input; // [sp+F8h] [bp-114h]@1
  unsigned int v7; // [sp+1FCh] [bp-10h]@1
  int v8; // [sp+208h] [bp-4h]@1
  int savedregs; // [sp+20Ch] [bp+0h]@1

  memset(&v2, 0xCCu, 0x1F4u);
  v7 = (unsigned int)&savedregs ^ __security_cookie;
  v5 = 0;
  sub_43650C((int)"plz input your flag:", (unsigned int)&savedregs ^ __security_cookie);//printf
  sub_4343D8("%s", &input, 256);//scanf
  v3 = sub_4357C9(288);
  v8 = 0;
  if ( v3 )
    v2 = sub_43618D(&input);
  else
    v2 = 0;
  v4 = v2;
  v8 = -1;
  v5 = v2;
  sub_433267(v2);//change_input
  sub_43438D(v5);//strcmp
  if ( sub_43418A(v5) )//get_result
    sub_43650C((int)"flag is true!\n", v1);
  sub_43350A();
  sub_43410D("pause");
  sub_43590E(&savedregs, &dword_43A31C);
  sub_435A17();
  return sub_434716();
}

雖然能夠從字串推測出來printf和scanf,但是大部分函式都經過多層包裝,很難發現真正含義

這一題簡單的做法是直接通過OD進行動態除錯,從scanf開始跟蹤input
發現在sub_433267後暫存器中出現了新的字串
而在sub_43438D後改變了eax的值,最後跳轉是test eax,eax,即比較過程應該在sub_43438D中完成

回到IDA中觀察,sub_433267的過程很簡單:

int __thiscall sub_43A670(int this)
{
  unsigned int v1; // [email protected]
  char v3; // [sp+Ch] [bp-D8h]@1
  unsigned int i; // [sp+D0h] [bp-14h]@2
  int v5; // [sp+DCh] [bp-8h]@1

  memset(&v3, 0xCCu, 0xD8u);
  v5 = this;
  if ( *(_DWORD *)(this + 280) )
  {
    for ( i = 0; ; ++i )
    {
      v1 = sub_4340BD(v5);
      if ( i >= v1 )
        break;
      *(_BYTE *)(i + v5) ^= 0xCu;
    }
  }
  return sub_434716();
}

sub_4340BD應該是get_value類的函式,取出資料成員
核心語句為最後的異或0xC

嘗試輸入123456789,手動逐字元與0xc異或後與sub_433267後的字串對比發現一致
下一步則是找到cmp的字串常量,IDA中發現地址為this + 256
看來是類常量
最簡單的方法就是直接OD檢視暫存器中的另一個字串,發現為:

_UOwXN=`KH?d|G;Utz_vq

指令碼異或處理後得到flag:SYC{TB1lGD3hpK7YxvSz}

這種是比較簡單的類逆向,如果是很複雜的類,則需要理清類結構了

首先知道,this指標通常存放在ecx中
也就是說,如果很多函式呼叫之前mov ecx, xxx了,那麼很可能它們就是函式成員
例如本題中,change_flag、strcmp和get_value都是函式成員

0111A296   .  8B8D E0FEFFFF mov ecx,dword ptr ss:[ebp-0x120]
0111A29C   .  E8 C68FFFFF   call CTF_RE_B.01113267                   ;  change_input
0111A2A1   .  8B8D E0FEFFFF mov ecx,dword ptr ss:[ebp-0x120]
0111A2A7   .  E8 E1A0FFFF   call CTF_RE_B.0111438D                   ;  strcmp
0111A2AC   >  8B8D E0FEFFFF mov ecx,dword ptr ss:[ebp-0x120]
0111A2B2   .  E8 D39EFFFF   call CTF_RE_B.0111418A
0111A2B7   .  85C0          test eax,eax
0111A2B9   .  74 11         je short CTF_RE_B.0111A2CC

每次呼叫之前都將ebp-0x120送入ecx中,很可能就是在取this指標
因為函式成員的第一個引數必為this(隱性)
同時,如果函式體內ecx還未被初始化就被使用,那麼基本上就可以確定它是函式成員了

注意IDA在這裡反編譯的時候給他們送入了錯誤的引數,甚至沒有引數
說明IDA對類的函式成員識別地不太好

在記憶體中,類的成員是依次排列的,所以經常會使用this + xxx的方式來呼叫資料成員
虛擬函式表的指標存放在類中,通常call eax這一類就是在呼叫虛擬函式表
這種情況下首先要找到虛擬函式表,然後再逐個函式反編譯

C. 明日計劃
國賽RE

相關推薦

170921 逆向-CTF平臺ReverseMe&CLAZZ

1625-5 王子昂 總結《2017年9月21日》 【連續第354天總結】 A. Syclover成信CTF練習平臺-RE B. ReverseMe 開啟是一個elf檔案,執行報段錯誤 通過gdb除錯發現錯誤出現在sub_400646的puts函式

使用JAVA開發微公眾平臺——環境搭建與開發接入

iges 微信平臺 校驗 後臺服務 結果 png 交互 package app 一、 初始微信公眾平臺 微信公眾平臺,即我們平時所說的“公眾號”,曾用名“官方平臺”、“媒體平臺”,但最終命名為&ldq

黨建息化智慧黨建平臺

原則 展開 共享 客戶 對待 人情味 重要 移動互聯 服務器安全 黨建信息化(智慧黨建)平臺一、概述(黨建信息化趨勢)2011年,習主席同誌在全國組織部長會議上指出,各級黨委要高度重視信息化發展對黨的建設的影響,做到網絡發展到哪裏、黨的工作就覆蓋到哪裏,充分運用信息技術提高

公眾平臺開發——微授權登入OAuth2.0

1、OAuth2.0簡介   OAuth(開放授權)是一個開放標準,允許使用者讓第三方應用訪問該使用者在某一網站上儲存的私密的資源(如照片,視訊,聯絡人列表),而無需將使用者名稱和密碼提供給第三方應用。   允許使用者提供一個令牌,而不是使用者名稱和密碼來訪問他們存放在特

硬體平臺 1 總說明

微信硬體平臺 本文目的,使用微信公眾號控制ESP8266的LED開和關。進一步使用微信當遙控器(避免寫APP或者IOS或者小程式),控制一切裝置。給兩個關鍵的總教程參考。 官網教程  微信硬體平臺 微信控制arduino點亮LED 教程  目前整體測試效果

硬體平臺 裝置直連微

微信硬體開發文件 智慧硬體廠家的痛點 微信硬體平臺是基於微信公眾號體系的智慧硬體平臺,在公眾號的技術架構裡,裝置廠商必須要有自己的伺服器。廠商伺服器主要完成兩部分工作: 1、管理裝置的連線登入、鑑權、狀態上報、命令傳送、韌體更新等基礎網路功能; 2、通過H5頁面或者微信公眾平臺訊息介面,接

硬體平臺0 流程介紹

https://blog.csdn.net/yueqian_scut/article/details/51513605     四、物聯網的核心要素        本文是從開發者的角度去分析整個微信硬體平臺物聯網,不去探討

硬體平臺 裝置控制控制面板-網頁sokect-mqtt長連線

給微信硬體裝置新增我們自己的控制面板。   主要問題: 1 要保證長連線,這樣面板可以實時互動陰間裝置,http一次性的連線模式通訊不行。   面板必須是網頁化的,網頁就可以操作互動。不用APP和小程式。 2 長連線需要websocket技術,可以保證長連線。 3 &

Arduino+W5100+新浪雲SAE開發語言:Python+微公眾平臺實現LED控制

閱讀本部落格之前,建議先參考部落格:微信客戶端+微信公眾平臺+新浪雲SAE+Arduino+WS100(控制LED) 不同之處:主要是伺服器使用的語言,本部落格使用的是Python 一、硬體部分 1) Arduino、W5100 連線圖如下: 硬體

SpringCloud微服務雲架構構建B2B2C電子商務平臺十二springboot集apidoc

boolean obj 復制 soft 文檔 tex end 錯誤 值類型 首先聲明下,apidoc是基於註釋來生成文檔的,它不基於任何框架,而且支持大多數編程語言,為了springboot系列的完整性,所以標了個題。 一、apidoc簡介 apidoc通過在你代碼的註釋來

unity3d利用sharesdk分享內容至微、新浪微博、qq空間等國內主流社交平臺ios篇

大家在玩遊戲時,通常都會看到分享的功能,最常見的是分享到微信朋友圈、qq空間或者新浪微博,產品經理通常稱這個功能模組為社會化。那這個功能在unity3d製作的遊戲中怎麼做到的呢?以前的老做法是按照對應的ios、安卓平臺、在微信or新浪微博上下載對應的sdk、按照其說明文件

mpvue 同時開發和打包H5和微小程式簡易模板

開始 這個專案是一個mpvue 的demo, 沒有具體的業務實現方法,只有簡單的頁面切換,還有常用的一些方法封裝,總體提供分開打包開發的思路 目錄結構 . ├── README.md ├── build

開源微服務任務排程平臺SIA-TASK

  背景 無論是網際網路應用或者企業級應用,都充斥著大量的批處理任務。常常需要一些任務排程系統幫助開發者解決問題。隨著微服務化架構的逐步演進,單體架構逐漸演變為分散式、微服務架構。在此的背景下,很多原先的任務排程平臺已經不能滿足業務系統的需求。於是出現了一些基於分散式的任務排程平臺。這些平臺各有

伴隨著我娃成長的運維平臺持續開源..

自動化運維寫在片頭:我娃出生的時候,平臺V1.0版本正好上線。純屬個人項目,身兼業務需求人員,產品經理,前端,後端,測試於一體,代碼層面會有邏輯問題,請各位看官見諒。很多人都問我為什麽不直接上代碼,寫那麽多廢話幹啥。我只想說,冰冷的代碼無法表達我對運維的熱愛,我會以授之以漁的方法去介紹我當時寫各個模塊的思路,

七日蝶課程一覽持續更新

七日成蝶 c語言 c++ thinkphp5 flashcs6 nginx php mysql openldap ssl apache tomcat本文列出了七日成蝶所有課程的鏈接,並會隨時更新,敬請關註。所有課程主頁:http://edu.51cto.com/lecturer/8403723.html七日成

大數據Hadoop學習之搭建Hadoop平臺2.1

穩定版 發的 log tar sshd scheduler 文件夾 三種 rest    關於大數據,一看就懂,一懂就懵。 一、簡介   Hadoop的平臺搭建,設置為三種搭建方式,第一種是“單節點安裝”,這種安裝方式最為簡單,但是並沒有展示出Hadoop的技術優勢,適

python利用第三方模塊,發送短驗證碼測試案例

python2 發送短信驗證碼今天學到個利用python第三方,發送短信驗證碼的代碼,速實現一遍,短信立即收到,果斷記錄在案! 環境:虛擬機上centos7平臺,python2.7版本; 第三方服務提供商是:雲通訊官網:www.yuntongxun.com/ 只需要註冊賬號即可,利用其免費測試api實現pyt

vue 打包 apk 文件修改路徑

conf 作用 路徑 assets http 修改 tor 圖片 目錄 第一個坑:文件引用路徑 現在項目我們什麽都沒動,是初始化之後直接打包的狀態,打開dist/index.htmnl文件整個網頁都是一片空白的。 爬坑: 打開 config文件夾/index.js文件 a

分享一些免費的接碼平臺國外號碼

org lan tro padding 德國 targe align reg 服務 名稱 網址 號碼所在國家 備註 SMS Receive Free https://smsreceivefree.com/ 加拿大、美國 SMS on

django+xadmin在線教育平臺十七

在線 __date__ 書寫 favor 自己 agen cli 相同 ted 8-1 課程列表 拷貝課程列表頁到template目錄 創建課程相關的urls.py Mxonline2/urls.py中聲明包含到course的url中: # 課程app的url配置