[완료]어셈블리에 대한 질문입니다...ㅠㅠ
글쓴이: soungsoo / 작성시간: 수, 2009/02/25 - 2:23오후
안녕하세요...
몇일째 찾아봐도 답이 없어 이렇게 고수님들의 도움을 구합니다.
질문은
1. 아래의 디버깅화면에서 004046F8의 변수 'Strpublic'의 메모리 주소와 오프셋을
구하는 방법입니다.
2. 메모리 주소를 오프셋을 참조하지 않고 직접 구하는 공식이나, 방법
... 꼭 좀 알려주세요
.text:004046EC aHanpublic db 'hanPublic',0
.text:004046F6 align 4
.text:004046F8 aStrpublic_0 db 'strPublic',0
Forums:
메모리 주소는..
메모리 주소 = 세그먼트주소 + 오프셋
.text:004046F8 aStrpublic_0 db 'strPublic',0
위에서 세그먼트 주소는 .text
오프셋은 004046F8(16진수)
즉,
메모리 주소 = 세그먼트주소 + 오프셋 = .text주소 + 004046F8
.text 세그먼트 주소만 알면 될듯한데요.(이것은 아키텍쳐 의존적입니다)
From:
*알지비 (메신저: rgbi3307@nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
답변 감사합니다...그런데
메모리 주소가 '세그먼트주소 + 오프셋'이라 하셨는데,
제가 찾기론 'EBP'에 세그먼트주소가 넘어 온다하여
대입을 해 보니 결과값이 일치하지 않습니다.
좀 더 자세히 알려 주실수 있으시겠습니까?.
주소 공간을 보니 Win32 쪽인 것 같은데요.
PE나 ELF 같은 Flat memory model일 경우 세그먼트는 계산할 필요가 없습니다.
Relocation이 있는 경우도 있습니다만 그건 코드 섹션 쪽이고 데이터 쪽에는
Relocation 정보가 들어가지 않습니다. (적어도 현존하는 컴파일러에서는 그렇
습니다) 저 상태로 본다면 004046F8이 해당 메모리 영역의 논리적 주소가 됩니다.
P.S 정확히 질문의 의도가 뭔지 이해가 되지 않는군요. 의도를 명확히 해 주시면
답을 달기 쉬울 것 같습니다.
ECS + 004046F8 가
ECS + 004046F8 가 아닐까요?
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
macro assembly인가요?
macro assembly인가요? macro assembly의 문법은 잘몰라서.
.text:004046EC aHanpublic db 'hanPublic',0
.text:004046F6 align 4
.text:004046F8 aStrpublic_0 db 'strPublic',0
희안하네요. label은 aStrpublic_0인데 그 값이 strPublic이군요.
그런데 strPublic은 label인가요? 아니면 string인가요?
label이면 다음과 같이하면 구해집니다.
ARM : ldr r0, aStrpublic_0
x86 : mov eax, aStrpublic_0
문법이 각기 다를수 있으니 일단 주의하시고,
방법은 absolute address를 구하고자 하는 label을 변수(ex : db)에 저장하고
해당 변수를 읽어보면 쉽게 구할수 있습니다.
x86쪽 코드에 잘못된 부분이 있습니다.
MASM의 경우 db, dw, dd 등으로 선언된 데이터 공간에 대해서는 mov를 사용할 경우
해당 주소에 있는 값을 읽어서 저장합니다. (label의 offset을 지정하려면 offset
키워드를 사용해야 합니다) 즉, mov eax, [aStrpublic_0]으로 처리하는 겁니다.
일단 저장 공간의 타입이 dword 타입이 아니므로 오류가 나올 가능성이 높기는 합니다만...
그건 어셈블을 시도해 볼 때 나올 수 있는 문제고요.
말씀하신 의도대로라면
x86: mov eax, offset aStrpublic_0
또는
x86: lea eax, aStrpublic_0
으로 해야 합니다.
그런데.. 질문자의 의도가 이걸 의도했다고 보기는 힘든 것이 그 다음 답글에서
EBP의 값을 읽었다고 하는건데요. 아무래도 적재된 메모리 공간에서 특정 코드를
검색하는 걸 질문한 건지도 모르겠다는 생각이 들고 있습니다.
참고로 저 어셈블리 리스팅은 DataRescue사의 Interactive Disassembler에서
역어셈블하면 나타나는 코드 패턴입니다.
네. 질문자가 strPublic
네. 질문자가 strPublic label의 값을 알고 싶어하는것 같아서
위 코드를 알려준것입니다.
인용1 :
"질문은
1. 아래의 디버깅화면에서 004046F8의 변수 'Strpublic'의 메모리 주소와 오프셋을
구하는 방법입니다."
strPublic이 aStrpublic_0보다 Strpublic에 유사하기에 strPublic 전제하에 설명했네요.
인용2 :
.text:004046F8 aStrpublic_0 db 'strPublic',0
그런데 strPublic 사이에 따옴표(')가 있어서 label인지 string인지 물어본거고
macro assembly는 그다지 자주 사용하지 않는 assembly이기에 문법을 찾아보기 번거로워
label이라는 가정하에 strPublic abs 주소를 읽어올수 있는 방법을 일러준것입니다.
어떤 disassembler를 쓴지는 모르겠지만 어쨌던 compiler가 C label에 'a' prefix를 붙이는가 보군요.
댓글 달기