日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Have a tea -(极客大挑战(SMC,fork

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Have a tea -(极客大挑战(SMC,fork 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

無殼,IDA打開64?

分析start函數。 smc?解密,通常處理smc?解密有兩種?法,如果是?較簡單的?解密, 我們可以直接使?idapython寫?個腳本即可解決,如果碰?運算不太好實現的smc?解密,?如這?。

嘗試動態調試,我們要在下?的jmp指令處下斷點?

jmp跳轉?

?右鍵analyzed 選Force 把紅色代碼部分P鍵定義成函數

?F5起始地址,查看到main函數,猜測后面為init函數

優先查看init函數(先于main函數執行

部分main函數:

?發現調?了fork 來創建?進程并執?了不同的邏輯

關于fork:

當程序調?fork函數時,系統會創建新的進程并為其分配資源;然后,會將原來進程的相關內容全部復制到新的進程中。

fork()函數被調??次,但是會返回兩次(??進程各?次)

返回值分析:

1)在?進程 中,fork函數返回0

2)在?進程中,fork函數返回新創建?進程的ID

3)如果出現錯誤,fork返回?個負值

(對1和2的原因分析:①在?進程中通過調?getppid可以?便的知道?進程的PID;②沒有?個函數可以使?進程獲得其所有?進程 的PID。(所以在fork返回時,將?進程的PID直接返回給?進程))

特點:

1. ?、?進程共享正?段,不共享數據、堆、棧段,?進程獲得?進程數據、堆、棧段的副本。

2. ?進程會獲得緩沖區的副本,即fork前進程緩沖區中的數據未被flush掉,則fork后,?進程能夠獲得?進程緩沖區中的數據。

3. ?進程所有被打開的?件描述符都會被復制到?進程中。 注:fork之后處理?件描述符通常有兩種情況: ①?進程等待?進程結束; ②?、?進程各?執?不同的正?段(?、?進程各?關閉不需要使?的?件描述符);

4. fork之后?、?進程的區別: ①fork的返回值; ②進程ID不同; ③?進程也不同; ④?進程的tms_utime、tms_stime、tms_cutime和tms_ustime均被設置為0; ⑤?進程設置的?件鎖不會被?進程繼承; ⑥?進程的未處理的鬧鐘被清除; ⑦?進程的未處理信號集設置為空集;

5. fork失敗的兩個主要原因: ①系統中進程數?已經達到上限; ②該實際?戶的進程總數達到系統限制;?

13 使??法:

①?個進程希望復制??,使得?、?進程執?不同的代碼段。如?進程監聽端?,收到消息后,fork出?進程處理消息,?進程仍 然負責監聽消息。(?監聽,?處理信息)

②?個進程需要執?另?個程序。如fork后執??個shell命令。

分析init函數,

其實在這?的話就是?進程waitpid等待?進程,?進程執?真正的邏輯 并且?進程?了ptrace來反調試(?個進程只能被?個進程ptrace,如果你??調?ptarce,這樣其它程序就?法通過ptrace調試或者向 您的程序進程注?代碼) 所以?調試器不能調試?進程,ptrace的處理要么就是讓他不執?,要么就是直接將其nop掉 但是我們這?就是要想辦法調試?進程,最?便的?法就是直接在其fork創建?進程之前,就ctrl+n強制設置rip跳轉到?進程的邏輯執 ?

我ctrl+n沒起作用。。。

點進去函數?

cbc模式的tea,data1和data2每次加密都會更新,且每次的更新都和我們的輸?有關 我們有最后的?較數據,data1和data2只知道初始值,所以以這些條件我們能解開前8字節(cmp → reverse_tea → xor_with_data → inp) 然后我們實現?下正向的加密去更新data,就可以得到下?輪的data1和data2 從?以此類推的計算出每次加密的8個字節 先解開我們的前?個字節

先解開我們的前?個字節

#include <stdio.h> #include <stdint.h> uint32_t data1 = 0x5F797274; uint32_t data2 = 0x64726168; //初始的 data 值 void decrypt(uint32_t* v, uint32_t* k) { uint32_t delta = 0x9E3779B9; uint32_t v0 = v[0], v1 = v[1], sum = (delta * 32) & 0xffffffff, i; uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; for (i = 0; i < 32; i++) { v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); sum -= delta; } v0 = v0 ^ data1; v1 = v1 ^ data2; v[0] = v0; v[1] = v1; 2021極客?挑戰逆向疑題講解 16 } int main() { uint32_t temp[2] = { 0xC9FA3B95, 0x7CFD0735 }; uint32_t key[4] = { 0x65766967, 0x756F795F, 0x7075635F, 0x6165745F }; int i = 0; decrypt(temp, key); printf("%c%c%c%c%c%c%c%c", *((char*)&temp[0] + 0), *((char*)&temp[0] + 1), *((char*)&temp[0] + 2), *((char*)&temp[0] + 3), *((char*)&temp return 0; }

?最后的腳本

#include <stdio.h> #include <stdint.h> uint32_t data1 = 0x5F797274; uint32_t data2 = 0x64726168; //初始的data 值 void encrypt(uint32_t* v, uint32_t* k) { uint32_t v0 = v[0], v1 = v[1], sum = 0, i; data1 ^= v0; data2 ^= v1; v0 = data1; v1 = data2; uint32_t delta = 0x9E3779B9; uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; for (i = 0; i < 32; i++) { sum += delta; v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); } data1 = v0; data2 = v1; } void decrypt(uint32_t* v, uint32_t* k) { uint32_t delta = 0x9E3779B9; uint32_t v0 = v[0], v1 = v[1], sum = (delta * 32) & 0xffffffff, i; uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; for (i = 0; i < 32; i++) { v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); sum -= delta; } v0 = v0 ^ data1; v1 = v1 ^ data2; v[0] = v0; v[1] = v1; } 2021極客?挑戰逆向疑題講解 17 int main() { uint32_t array[] = { 0xC9FA3B95, 0x7CFD0735, 0x958C7C9F, 0xC143B59E, 0x61741E89, 0xF47DCDC4, 0xD6E2A1F2, 0x6A38E9AD, 0xC2C16FEB, 0x8C0EE99 uint32_t key[4] = { 0x65766967, 0x756F795F, 0x7075635F, 0x6165745F }; int i = 0; for (i = 0; i < 10; i += 2) { uint32_t temp[2]; temp[0] = array[i]; temp[1] = array[i + 1]; decrypt(temp, key); printf("%c%c%c%c%c%c%c%c", *((char*)&temp[0] + 0), *((char*)&temp[0] + 1), *((char*)&temp[0] + 2), *((char*)&temp[0] + 3), *((char*)&tem //更新data encrypt(temp, key); } //SYC{ySaySanDian_Zh0n_La_y1n_Cha_xIan} return 0; }

總結

以上是生活随笔為你收集整理的Have a tea -(极客大挑战(SMC,fork的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。