[완료]어셈블리에 대한 질문입니다...ㅠㅠ

soungsoo의 이미지

안녕하세요...
몇일째 찾아봐도 답이 없어 이렇게 고수님들의 도움을 구합니다.

질문은
1. 아래의 디버깅화면에서 004046F8의 변수 'Strpublic'의 메모리 주소와 오프셋을
구하는 방법입니다.

2. 메모리 주소를 오프셋을 참조하지 않고 직접 구하는 공식이나, 방법

... 꼭 좀 알려주세요

.text:004046EC aHanpublic db 'hanPublic',0
.text:004046F6 align 4
.text:004046F8 aStrpublic_0 db 'strPublic',0

rgbi3307의 이미지

메모리 주소 = 세그먼트주소 + 오프셋

.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/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

soungsoo의 이미지

메모리 주소가 '세그먼트주소 + 오프셋'이라 하셨는데,
제가 찾기론 'EBP'에 세그먼트주소가 넘어 온다하여
대입을 해 보니 결과값이 일치하지 않습니다.

좀 더 자세히 알려 주실수 있으시겠습니까?.

grassman의 이미지

PE나 ELF 같은 Flat memory model일 경우 세그먼트는 계산할 필요가 없습니다.
Relocation이 있는 경우도 있습니다만 그건 코드 섹션 쪽이고 데이터 쪽에는
Relocation 정보가 들어가지 않습니다. (적어도 현존하는 컴파일러에서는 그렇
습니다) 저 상태로 본다면 004046F8이 해당 메모리 영역의 논리적 주소가 됩니다.

P.S 정확히 질문의 의도가 뭔지 이해가 되지 않는군요. 의도를 명확히 해 주시면
답을 달기 쉬울 것 같습니다.

Fe.head의 이미지

ECS + 004046F8 가 아닐까요?

-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

anfl의 이미지


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)에 저장하고
해당 변수를 읽어보면 쉽게 구할수 있습니다.


grassman의 이미지

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에서
역어셈블하면 나타나는 코드 패턴입니다.

anfl의 이미지

네. 질문자가 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를 붙이는가 보군요.


댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.