日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
初探CTF中特殊框架逆向

QT框架程序逆向

QT框架簡介

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

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供舒城企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為舒城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

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

QT對象樹

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

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

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

tips:QWidget的操作流程

QWidget 也是 QObject 的子類,所以在 parent 機(jī)制上是沒有區(qū)別的。然而實(shí)際使用時(shí),對于 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:對象樹模型存在的問題

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

來看下面這段程序:

#include 
#include

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)建子對象,再創(chuàng)建父對象時(shí),根據(jù)自動(dòng)析構(gòu)原理,我們析構(gòu)父對象的時(shí)候會(huì)自動(dòng)析構(gòu)父對象,此時(shí),子對象已經(jīng)被析構(gòu)了,然而代碼繼續(xù)執(zhí)行,按照順序還要再析構(gòu)一次子對象,這時(shí)候已經(jīng)是第二次調(diào)用 子對象的析構(gòu)函數(shù)了。C++中不允許調(diào)用兩次析構(gòu)函數(shù),最終導(dǎo)致程序崩潰。

避免問題的方案:

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

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

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

先來看一下官方介紹:

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

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

信號槽編寫

QT5的書寫方式

#include 
#include

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ā)出信號的對象

signal:發(fā)送對象發(fā)出的信號

receiver:接收信號的對象

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

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

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

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

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

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

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

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

4.槽可以被取消鏈接

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

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. */ }
);

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

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

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

[GKCTF 2021]QQQQT

virtualbox打包的QT程序。

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

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

mfc框架逆向

mfc框架簡介

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

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

簡單來說,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)建注冊等工作。
  • 進(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()

使用工具

針對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??


網(wǎng)站題目:初探CTF中特殊框架逆向
文章來源:http://m.5511xx.com/article/ccddcec.html