2011-04-19 3 views
0

분해 된 바이너리를 리버스 엔지니어링하려고합니다. 나는 그것이 호출 할 때 무엇을하고 있는지 이해하지 못하는 등 :어셈블리에서 메모리 주소를 푸시하면 어떻게됩니까?

무엇 더욱 혼란하게하면 해당 주소가되지 않는 것입니다 및 명령의 주소 나에입니다 $ 0x804a254

푸시 기호 테이블입니다. 뭐하는거야?

+2

32 비트 숫자를 스택에 밀어 넣고 있습니다. 어떤 종류의 컨텍스트 없이는 더 이상 말을하는 것이 완전히 불가능합니다. –

+0

예, 한 장의 지시가 아니라 분해 한 부분을 게시하십시오. –

답변

2

이것은 해시, 숫자, 비트 플래그 또는 형식 변환 된 주소 일 수있는 상수, 모든 범위에서 정적으로 할당되는 변수 또는 버퍼의 주소 (문자열 리터럴 포함) 중 하나입니다. 또는 missanalyzed 피연산자 (암호화/정크) 때문입니다. 그것의 진정한 의미는 그것의 사용과 관련이있다 (호출 인수 나 mem/reg를 설정하는 간접적 인 방법 일까?).

1

거기에 표시된 값은 로컬 변수이기 때문에 어떤 테이블이나 명령어에도 없습니다. 주소는 위해

void somefunc() 
{ 
    int t; //t may have address 0x804a254 since this is a local variable. 
} 

같은 동일하다 (지역 변수는 특정 방법에있는 동안 그들은 단지 "살아"때문에 심볼 테이블과 연관된 이름을 유지하지하기 위해) 제대로 메모리를 지역 변수로 메모리의 다른 위치 대신 시스템 스택에 할당됩니다. 함수가 생성 될 때 푸시되고 함수가 반환 될 때 팝업됩니다.

+0

x86에서 esp (또는 ebp) 레지스터를 사용하여 참조 된 로컬 함수 변수가 아닌가요? 나는 0x804a254가 오히려 전역 변수 주소 또는 나중에 튀어 나오는 상수가 될 수 있다고 생각합니다 ... –

+0

로컬 변수는 절대 주소가 아닌 스택 포인터 (예 : ebp 또는 esp)를 기준으로 주소가 지정됩니다. 그래서 나는 그것이 여기서 일어나는 일이 의심 스럽습니다. –

+0

0x4 또는 % eax 또는 그 밖의 것을 밀어 넣지 않았기 때문에 전역 변수입니까? 그렇다면 결코 다시는 참조 할 수 없으면 글로벌하게 만드는 것이 의미가 없습니다. jmp * 0x804b0fc 또한 해당 주소가 디스 어셈블리 또는 기호 테이블의 다른 곳에서 참조되지 않는 경우를 의미합니까? – Gabe

1

이 명령어는 단순히 32 비트 상수 (0x804a254)를 스택에 푸시합니다.

그 지시만으로는 나중에 어떻게 사용되는지 알 수 없습니다. 코드 해체를 더 많이 제공 할 수 있습니까? 특히이 값이 튀어 나오는 곳과이 값이 나중에 어떻게 사용되는지를보고 싶습니다.

리버스 엔지니어링을 시작하기 전에이 책 (Reverse Engineering secrets)을 읽고 X86 명령어 세트 설명서 (Intel 또는 AMD)를 읽는 것이 좋습니다. 나는 당신이 x86 CPU 용 리버스 엔지니어링이라고 가정하고 있습니다.