成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

初探CTF中特殊框架逆向

開發(fā) 架構(gòu)
Qt 是一個(gè)1991年由Qt Company開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。

最近做題,逐漸遇到一些非 IAT32 ASR arm32,64(Linux)框架之外的 各種框架的re程序逆向分析。雖然題目難度不大,但著實(shí)令人耳目一新。而且這會(huì)不會(huì)是出題人釋放的信號(hào),代表著未來re出題的新方向呢?本著認(rèn)真嚴(yán)謹(jǐn)?shù)膽B(tài)度,我想應(yīng)該把它們做一個(gè)總結(jié)。

QT框架程序逆向

QT框架簡(jiǎn)介

Qt 是一個(gè)1991年由Qt Company開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣埽褂锰厥獾拇a生成擴(kuò)展(稱為元對(duì)象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴(kuò)展,并且允許真正地組件編程。另一方面,QT實(shí)現(xiàn)了全面支持iOS、Android、WP,它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所有功能。

Qt框架應(yīng)用還是很廣泛的,為了大家有一個(gè)直觀的概念,我用Everything搜索了下我電腦上的qt5core.dll,部分結(jié)果如下圖所示:

QT對(duì)象樹

Qt提供了一種機(jī)制,能夠自動(dòng)、有效的組織和管理繼承自QObject的Qt對(duì)象,這種機(jī)制就是對(duì)象樹。

如圖所示,QObject 對(duì)象有且僅有一個(gè)父對(duì)象,但可以有很多個(gè)子對(duì)象。按照這種形式排列就會(huì)形成一個(gè)對(duì)象樹的結(jié)構(gòu),最上層是父對(duì)象,下面是子對(duì)象,在再下面是孫子對(duì)象,以此類推。當(dāng)父對(duì)象析構(gòu)的時(shí)候,這個(gè)子對(duì)象列表中的所有對(duì)象都會(huì)被析構(gòu),當(dāng)析構(gòu)子對(duì)象的時(shí)候,會(huì)自動(dòng)從父對(duì)象的子對(duì)象列表中刪除。

那么Qt為什么要這樣設(shè)計(jì)呢?很簡(jiǎn)單,方便內(nèi)存管理我們?cè)趧?chuàng)建 QObject 對(duì)象時(shí),提供一個(gè)父對(duì)象,那么我們創(chuàng)建的這個(gè) QObject 對(duì)象會(huì)自動(dòng)添加到其父對(duì)象的 children() 列表。這種機(jī)制在GUI程序開發(fā)過程中是相當(dāng)實(shí)用的。值得注意的是,如果在構(gòu)造時(shí)設(shè)置父對(duì)象為 NULL,那么當(dāng)前實(shí)例不會(huì)有父對(duì)象存在,Qt 也不會(huì)自動(dòng)析構(gòu)該實(shí)例。

tips:QWidget的操作流程

QWidget 也是 QObject 的子類,所以在 parent 機(jī)制上是沒有區(qū)別的。然而實(shí)際使用時(shí),對(duì)于 QWidget 和其派生類來說,在內(nèi)存管理上要稍微復(fù)雜一些。例如QWidget的關(guān)閉流程,首先用戶點(diǎn)擊關(guān)閉按鈕觸發(fā) close()槽,默認(rèn)的 QCloseEvent 會(huì)將 widget隱藏起來,也就是觸發(fā)hide()槽。也就是說widget的關(guān)閉實(shí)際是將其隱藏,而沒有釋放內(nèi)存,雖然我們有時(shí)會(huì)重寫 closeEvent 但也不會(huì)手動(dòng)釋放 widget。

解決方案:需要設(shè)置 Qt::WA_DeleteOnClose 屬性,那么會(huì)在 close 之后接著調(diào)用 widget 的析構(gòu)函數(shù)。

tips2:對(duì)象樹模型存在的問題

俗話說,百密終有一疏。對(duì)象樹模型的特殊析構(gòu)規(guī)則,大概注定著它會(huì)爆出邏輯性漏洞。

來看下面這段程序:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QPushButton btn("button");
QWidget widget;
btn.setParent(&widget);
widget.show();

return a.exec();
}

運(yùn)行結(jié)果:
關(guān)閉 widget 后程序崩潰,沒有正常結(jié)束

為什么程序會(huì)崩潰呢?通過上面的學(xué)習(xí)我們知道,C++規(guī)定了析構(gòu)順序應(yīng)該按照其創(chuàng)建順序的相反過程。而當(dāng)我們先創(chuàng)建子對(duì)象,再創(chuàng)建父對(duì)象時(shí),根據(jù)自動(dòng)析構(gòu)原理,我們析構(gòu)父對(duì)象的時(shí)候會(huì)自動(dòng)析構(gòu)父對(duì)象,此時(shí),子對(duì)象已經(jīng)被析構(gòu)了,然而代碼繼續(xù)執(zhí)行,按照順序還要再析構(gòu)一次子對(duì)象,這時(shí)候已經(jīng)是第二次調(diào)用 子對(duì)象的析構(gòu)函數(shù)了。C++中不允許調(diào)用兩次析構(gòu)函數(shù),最終導(dǎo)致程序崩潰。

避免問題的方案:

先創(chuàng)建父對(duì)象再創(chuàng)建子類對(duì)象,并且在創(chuàng)建子對(duì)象時(shí)就指定父對(duì)象;

盡量在堆上創(chuàng)建子對(duì)象;

QT程序的特殊機(jī)制--信號(hào)/槽

先來看一下官方介紹:

信號(hào)/槽是 Qt 框架引以為豪的機(jī)制之一。所謂信號(hào)槽,實(shí)際就是觀察者模式。當(dāng)某個(gè)事件發(fā)生之后,比如,按鈕檢測(cè)到自己被點(diǎn)擊了一下,它就會(huì)發(fā)出一個(gè)信號(hào)(signal)。這種發(fā)出是沒有目的的,類似廣播。如果有對(duì)象對(duì)這個(gè)信號(hào)感興趣,它就會(huì)使用連接(connect)函數(shù),意思是,將想要處理的信號(hào)和自己的一個(gè)函數(shù)(稱為槽(slot))綁定來處理這個(gè)信號(hào)。也就是說,當(dāng)信號(hào)發(fā)出時(shí),被連接的槽函數(shù)會(huì)自動(dòng)被回調(diào)。這就類似觀察者模式:當(dāng)發(fā)生了感興趣的事件,某一個(gè)操作就會(huì)被自動(dòng)觸發(fā)。(這里提一句,Qt 的信號(hào)槽使用了額外的處理來實(shí)現(xiàn),并不是 GoF 經(jīng)典的觀察者模式的實(shí)現(xiàn)方式。)

Qt使用信號(hào)(Signal)和槽(Slot)機(jī)制用于對(duì)象間的通信。可以將信號(hào)和槽通過QObject對(duì)象的connet函數(shù)關(guān)聯(lián)起來。我們可以使用emit(Qt定義的語句)發(fā)出某個(gè)信號(hào),與該信號(hào)關(guān)聯(lián)的槽就會(huì)接受到信號(hào)進(jìn)行處理。

信號(hào)槽編寫

QT5的書寫方式

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked,
&app, &QApplication::quit);
button.show();
return app.exec();
}

QT4的書寫方式

int main(int argc, char *argv[]) 
{
QApplication a(argc, argv);
QPushButton *button = new QPushButton("Quit");
connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
button->show();
return a.exec();
}

關(guān)鍵函數(shù) connect

connect()函數(shù)最常用的一般形式:

connect(sender, signal, receiver, slot);

參數(shù):

sender:發(fā)出信號(hào)的對(duì)象

signal:發(fā)送對(duì)象發(fā)出的信號(hào)

receiver:接收信號(hào)的對(duì)象

slot:接收對(duì)象在接收到信號(hào)之后所需要調(diào)用的函數(shù)

信號(hào)/槽的特殊性質(zhì)

1.一個(gè)信號(hào)可以和多個(gè)槽相連

如果是這種情況,這些槽會(huì)一個(gè)接一個(gè)的被調(diào)用,但是它們的調(diào)用順序是不確定的。

2.多個(gè)信號(hào)可以連接到一個(gè)槽

只要任意一個(gè)信號(hào)發(fā)出,這個(gè)槽就會(huì)被調(diào)用。

3.一個(gè)信號(hào)可以連接到另外的一個(gè)信號(hào)

當(dāng)?shù)谝粋€(gè)信號(hào)發(fā)出時(shí),第二個(gè)信號(hào)被發(fā)出。除此之外,這種信號(hào)-信號(hào)的形式和信號(hào)-槽的形式?jīng)]有什么區(qū)別。

4.槽可以被取消鏈接

這種情況并不經(jīng)常出現(xiàn),因?yàn)楫?dāng)一個(gè)對(duì)象delete之后,Qt自動(dòng)取消所有連接到這個(gè)對(duì)象上面的槽。

5.使用Lambda 表達(dá)式

在使用 Qt 5 的時(shí)候,能夠支持 Qt 5 的編譯器都是支持 Lambda 表達(dá)式的。

我們的代碼可以寫成下面這樣:

QObject::connect(&newspaper, static_cast
(const QString &)>(&Newspaper::newPaper),
[=](const QString &name)
{ /* Your code here. */ }
);

在連接信號(hào)和槽的時(shí)候,槽函數(shù)可以使用Lambda表達(dá)式的方式進(jìn)行處理。

6.信號(hào)槽要求信號(hào)和槽的參數(shù)一致

所謂一致,是參數(shù)類型一致。如果不一致,允許槽函數(shù)的參數(shù)可以比信號(hào)的少,即便如此,槽函數(shù)存在的那些參數(shù)的順序也必須和信號(hào)的前面幾個(gè)一致起來。這是因?yàn)椋憧梢栽诓酆瘮?shù)中選擇忽略信號(hào)傳來的數(shù)據(jù)(也就是槽函數(shù)的參數(shù)比信號(hào)的少),但是信號(hào)根本沒有這個(gè)數(shù)據(jù),槽函數(shù)中肯定無法使用。

[GKCTF 2021]QQQQT

virtualbox打包的QT程序。

奇怪的main函數(shù)....奇怪的關(guān)鍵函數(shù)。正向引用分析不了,main函數(shù)代碼非常奇怪...找不到關(guān)鍵函數(shù)調(diào)用。只能曲線救國(guó)一波,通過字符串搜索搜索到密文,再通過交叉引用定位到關(guān)鍵函數(shù)。

一個(gè)base58加密,解密即可:

mfc框架逆向

mfc框架簡(jiǎn)介

老規(guī)矩,先來看官方解釋:

MFC庫(kù)是開發(fā)Windows應(yīng)用程序的C++接口。MFC提供了面向?qū)ο蟮目蚣埽捎妹嫦驅(qū)ο蠹夹g(shù),將大部分的Windows API 封裝到C++類中,以類成員函數(shù)的形式提供給程序開發(fā)人員調(diào)用。

簡(jiǎn)單來說,MFC是一種面向?qū)ο螅糜陂_發(fā)windows應(yīng)用程序的框架,突出特點(diǎn)是封裝了大部分windows API,便于開發(fā)人員使用。

MFC程序的運(yùn)行過程分為以下四步:

  • 利用全局應(yīng)用程序?qū)ο髏heApp啟動(dòng)應(yīng)用程序。
  • 調(diào)用全局應(yīng)用程序?qū)ο蟮臉?gòu)造函數(shù),從而調(diào)用基類(CWinApp)的構(gòu)造函數(shù),完成應(yīng)用程序的一些初始化工作,并將應(yīng)用程序?qū)ο蟮闹羔槺4嫫饋怼?/li>
  • 進(jìn)入WinMain函數(shù)。在AfxWinMain函數(shù)中獲取子類的指針,利用指針實(shí)現(xiàn)上述的三個(gè)函數(shù),從而完成窗口的創(chuàng)建注冊(cè)等工作。
  • 進(jìn)入消息循環(huán),一直到WM_QUIT。

怎樣逆向mfc程序

怎樣逆向mfc程序?一個(gè)非常樸實(shí)無華的問題(大霧)。這里介紹常用的兩種方法。

尋找程序初始化函數(shù)下斷點(diǎn)

AfxOleInit (COM初始化)
AfxEnableControlContainer (Ole初始化)
AfxGetModuleState (獲取模塊狀態(tài))
CoInitialize (COM初始化 API)
GdiplusStartup (GDI+初始化)
SetUnhandledExceptionFilter (截獲異常處理)
Enable3dControls()
CWinApp()

使用工具

針對(duì)mfc程序逆向分析,前輩們已經(jīng)開發(fā)了一些非常好用的小工具,站在巨人肩膀上的我們,掌握了工具的使用方法,便可大大提高mfc程序的分析效率。

常用工具:

  • 彗星小助手
  • xspy
  • ResourceHacker

[HDCTF2019]MFC

首先通過彗星小助手獲取窗口信息(關(guān)鍵是句柄)。

得到:

944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b

一大串密文:

接著使用xspy掃描一下mfc窗口的各個(gè)框架。

掃到一個(gè)特殊的onMsg,0464,為什么說它特殊呢,因?yàn)樗俏ㄒ?一個(gè)沒有系統(tǒng)函數(shù)包裹的參數(shù)。

這里多提一嘴,xspy的使用方法是,拖拽小放大鏡到mfc窗口中(因?yàn)闊o知擱那雙擊了半天小放大鏡沒反應(yīng)急得跳腳)。

接下來我們利用彗星小助手傳遞0464(記得轉(zhuǎn)換為10進(jìn)制為1124)給mfc框。

這樣就得到了des key 找個(gè)des解密網(wǎng)站解密即可得到flag。

參考鏈接

??https://www.52pojie.cn/thread-497018-1-1.html??

??https://blog.csdn.net/liujiandu101/article/details/84390269??

??https://blog.csdn.net/baidu_41388533/article/details/111292441??

??https://blog.csdn.net/qq_34139994/article/details/105391611??

??https://www.52pojie.cn/thread-65091-1-1.html??

責(zé)任編輯:武曉燕 來源: FreeBuf.COM
相關(guān)推薦

2017-10-21 21:58:18

符號(hào)執(zhí)行AngrCTF

2022-07-15 12:42:22

Linux內(nèi)核裁剪

2009-09-08 13:47:11

SproutCoreHTML 5應(yīng)用框架

2012-02-09 16:09:17

JavaScript

2010-10-09 15:01:27

PhoneGapiPhoneAndroid

2012-03-16 13:43:29

2009-03-02 09:22:39

OSGiJ2EEEclipse

2016-09-29 09:37:50

2024-04-30 14:50:13

2009-03-30 15:52:24

Windows Emb

2009-06-24 13:22:27

Glassfish

2010-06-03 12:57:06

Hadoop

2016-10-11 13:48:41

WebGLJavascriptWeb

2015-08-31 10:30:14

AndroidSuppCoordinator

2013-07-19 09:50:10

Java8API

2009-07-08 09:44:54

TDDViual Studi

2023-04-07 09:07:11

2021-12-28 18:37:46

Transformer數(shù)據(jù)人工智能

2014-11-20 15:44:40

Apple Watch

2015-01-21 16:35:49

Apple WatchWatchKit
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: av网站观看 | 日韩欧美网 | 日韩中文一区 | 国产精品18毛片一区二区 | 欧美freesex黑人又粗又大 | 日韩免费 | 粉嫩国产精品一区二区在线观看 | 91精品在线播放 | 91视频在线看 | 蜜桃五月天 | 久久亚洲国产精品日日av夜夜 | 狠狠久久综合 | 91视频进入 | 国产精品久久久亚洲 | 日韩中文字幕一区 | 日韩中文字幕在线观看视频 | 看片国产| 能看的av | 99久久免费精品 | 亚洲国产一区在线 | 午夜免费在线电影 | 国产精品高潮呻吟久久av野狼 | 一色一黄视频 | 欧美一级特黄aaa大片在线观看 | 日本精品免费在线观看 | 五月天综合网 | 亚洲精品www久久久 www.蜜桃av | 欧美精品福利 | 青青草网站在线观看 | 欧美激情国产日韩精品一区18 | 999久久| 午夜视频免费 | 欧美高清视频一区 | 精品久久久久国产免费第一页 | 91av入口| 精品一区二区三区四区外站 | 91精品国产91久久久久久 | 亚洲一区二区三区在线视频 | 91深夜福利视频 | 成人性生交大片 | 99成人在线视频 |