Reversing Advanced

Reversing Advanced

IDA lumina 서버

IDA lumina 서버는 코드를 분석하는 과정에서 심볼 정보를 임의로 제공받아 분석을 좀 더 용이하게 할 수 있게 도와주는 서버입니다. lumina 서버는 알려진 함수들의 시그니처 정보가 저장된 서버로, 사용자는 시그니처를 공유하거나 모르는 함수에 대한 정보를 공유받을 수 있습니다. 따라서 심볼을 제공받지 못했거나 처음 보는 복잡한 코드를 쉽고 원활하게 분석 할 수 있도록 도움을 줍니다. 저는 나름대로 도움 받고 있다고 생각해서 공유하고자합니다. 다음은 IDA에서 lumina 서버를 사용하는 방법입니다. https://abda.nl/lumen/ LumenAlternative Lumina server for IDA Pro - Allows users to pull function metadata from ..

Reversing Advanced

IDA "sp-analysis failed" 에러 해결 방법

함수를 디컴파일하는 과정에서 JUMPOUT()이 뜨면서 디컴파일이 정상적으로 안되는 경우가 있습니다. 이번 포스트는 이런 에러를 해결하고 함수를 정상적으로 디컴파일하는 방법을 소개합니다. asm 코드를 보면 "endp ; sp-analysis failed"라는 오류가 발생하면서 디컴파일이 수행되지않습니다. 해당 오류는 스택 포인터가 잘못 설정된 경우에 발생하는데요. 따라서 스택 포인터를 정상적인 값으로 다시 설정하면 오류를 해결할 수 있습니다. 다만, 필자는 스택 포인터를 바꾸는 방법으로 오류를 해결할 수 없었습니다. 여러가지 방법을 시도했지만, 전부 실패하고 함수를 재정의하는 방법만 성공했습니다. 따라서 함수를 재정의해서 정상적으로 디컴파일하는 방법을 공유하겠습니다. 먼저, 오류가 발생한 "endp ;..

Reversing Advanced

IDA를 이용한 바이너리 패치

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..

Reversing Advanced

[dreamhack] 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 __fastcall s..

Reversing Advanced

[dreamhack] 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]를 구하려고 여러가지 ..

Reversing Advanced

[dreamhack] 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 연산해주면 되기 때문에 쉽게 해결할 수 있다. XOR 연산을 수행하..

keyme
'Reversing Advanced' 카테고리의 글 목록