IDA lumina 서버IDA lumina 서버는 코드를 분석하는 과정에서 심볼 정보를 임의로 제공받아 분석을 좀 더 용이하게 할 수 있게 도와주는 서버입니다. lumina 서버는 알려진 함수들의 시그니처 정보가 저장된 서버로, 사용자는 시그니처를 공유하거나 모르는 함수에 대한 정보를 공유받을 수 있습니다. 따라서 심볼을 제공받지 못했거나 처음 보는 복잡한 코드를 쉽고 원활하게 분석 할 수 있도록 도움을 줍니다. 저는 나름대로 도움 받고 있다고 생각해서 공유하고자합니다. 다음은 IDA에서 lumina 서버를 사용하는 방법입니다. https://abda.nl/lumen/ LumenAlternative Lumina server for IDA Pro - Allows users to pull function m..
IDA "sp-analysis failed" 에러 해결 방법함수를 디컴파일하는 과정에서 JUMPOUT()이 뜨면서 디컴파일이 정상적으로 안되는 경우가 있습니다. 이번 포스트는 이런 에러를 해결하고 함수를 정상적으로 디컴파일하는 방법을 소개합니다. asm 코드를 보면 "endp ; sp-analysis failed"라는 오류가 발생하면서 디컴파일이 수행되지않습니다. 해당 오류는 스택 포인터가 잘못 설정된 경우에 발생하는데요. 따라서 스택 포인터를 정상적인 값으로 다시 설정하면 오류를 해결할 수 있습니다. 다만, 필자는 스택 포인터를 바꾸는 방법으로 오류를 해결할 수 없었습니다. 여러가지 방법을 시도했지만, 전부 실패하고 함수를 재정의하는 방법만 성공했습니다. 따라서 함수를 재정의해서 정상적으로 디컴파일하는..
IDA로 바이너리 코드를 패치하는 방법에 대해서 소개하겠습니다. 저는 target이라는 프로그램을 IDA로 패치해서 원하는 결과를 출력하는 것을 목적으로 진행할 것입니다. 실습하고 싶으신 분들은 다음 설명에서 C 코드 제공되니 직접 컴파일해서 따라해보시면 좋을 것 같습니다. ○ target.c#include #include int compare(const void *a, const void *b) { int num1 = *(int *)a; int num2 = *(int *)b; if (num1 num2) return 1; return 0;}void solution(int arr[], int arr_size, int num[], int num_size) { int N = arr..
rev-basic-9_BOOL8 __fastcall sub_140001000(const char *buf){ int i; // [rsp+20h] [rbp-18h] int len; // [rsp+24h] [rbp-14h] len = strlen(buf); if ( (len + 1) % 8 ) return 0i64; for ( i = 0; i buf 길이가 8의 배수여야 한다.buf를 8자리씩 sub_1400010A0()로 검증한다.sub_1400010A0()이 실행된 후, buf[i] == &unk_140004000 조건이 충족해야 한다.sub_1400010A0() 가 실행된 후의 buf가 [그림]의 데이터와 일치하면 된다. 다음으로 sub_1400010A0()를 분석해보자.__int64 _..
rev-basic-8__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i a1[i] * -5 == byte_140003000[i] 을 만족하는 a1[i] 를 구하는 문제다. 단순한 방법은 a1[i] == byte_140003000[i] / -5 를 연산해서 a1[i]를 구하는 것이다. 그러나 단순하게 생각해서 구현하면 a1[i] 을 구할 수 없다.이유는 if문을 보면 a1[i] * -5 연산 후에 (unsigned __int8)로 형변환을 수행하기 때문이다.즉, 형변환까지 고려해서 a1[i]을 구해야한다. 역연산으로 byte_140003000[i]부터 a1[i]를..
rev-basic-7__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i a1[i]과 (i&7)을 ROL 연산ROL 연산 결과를 i와 xor 연산결과를 byte_140003000[i]와 비교 핵심으로 알아야 하는 키워드는 ROL 연산이다. ○ ROL쉽게 설명하면 left shift 연산이랑 비슷한데, 연산 수행 후에 기존 8자리를 벗어나게 되는 비트는 오른쪽 맨 끝 자리로 돌아오는 형태의 연산이다.shitf 연산인데 큐처럼 동작하는 shift 연산이라고 비유하면 될 것 같다. XOR 연산의 경우는 양변을 i로 XOR 연산해주면 되기 때문에 쉽게 해결할 수 있다. ..