os 공부 중 이해가 안되는 부분이 있네요.

Reper의 이미지

현재 os를 만들기 위해서 책을 보며 공부하고 있는데요.

lea esp, [pm_start-256]
 
push dword user_data_selector
push esp
push dword 0x200
push dword user_code_selector
lea eax, [user_process]
push eax
iretd

이 부분에서 pm_start가 커널 스택 영역의 주소이고 pm_start-256이 유저 스택 영역의 주소입니다.
esp에 pm_start-256의 주소를 넣음으로써 유저 스택 영역의 주소를 넣었음이 확실한데 ..

저자는 push 되는 부분부터 현재 esp에 커널 스택 주소(pm_start)가 들어있으며
push되는 값들이 모두 커널 스택에 쌓인다고 하네요.

무슨 말인지 납득이 가질 않는데... 혹시 도와주실 수 있으신가요 ?

Necromancer의 이미지

끝의 iretd를 못보셨군요.
lea 명령 다음에 나오는 push 명령들은 복귀할 user mode의 ss:esp, cs:eip 어드레스를 커널스택에 push합니다.
iretd 실행되면서 이들이 한꺼번에 pop 되고 cs:eip는 물론 ss:esp도 바뀝니다.
위의 경우는 유저모드 복귀 이후 esp는 pm_start-256의 값을 갖는게 맞지만 ss도 바뀌기 때문에 커널모드에서 참조하고 있는 그 주소인지는 장담 못합니다. 확인할려면 ss가 가리키는 세그먼트 디스크립터를 까봐야죠.

더불어서 커널스택과 유저스택은 보통 세그먼트 자체가 완전히 다르고 pm_start-256 하는 이유는 이 소스만으로는 알 수 없습니다.
아 앞의 push 명령 때문에 esp는 pm_start-260이 되겠군요. (4바이트가 더 빠짐)
커널스택과 유저스택은 같은 메모리 어드레스 쓰게 만들지도 않고요. 그렇게 했다간 보안상 문제 생깁니다.

덧붙어서 call(세그먼트까지 바뀌는 far call), ret, int, iretd 같은 명령은 목적지의 특권수준이 같을때와 다를 때의 동작 방식이 다릅니다.

Written By the Black Knight of Destruction

Reper의 이미지

다른 부분에 대해서는 다 이해가 갑니다. 그런데 제 질문의 요지는 esp에 lea명령을 사용하여 유저 스택 영역의 주소(pm_start-256)를 넣고 바로 밑에서 push명령을 사용하는데 저자는 값들이 커널 스택 영역(pm_start)에 쌓인다고 설명을 하네요. esp에 유저 스택 영역 주소가 들어있으니 유저 스택에 쌓여야 하는데 왜 커널 스택에 쌓이는지 납득이 안갑니다 ...

Necromancer의 이미지

그렇다면 커널모드와 유저모드에서 ss가 가리키는 디스크립터의 base address를 추적할 필요가 있겠네요.
base address가 같다면 같은 주소에 쌓이는게 맞고, 그렇다면 context switching이나 실행 후 결과값 반환 같은 뭔가의 작업이 있을것 같습니다.
님이 올리신 소스만으로는 판단할 수가 없습니다.

Written By the Black Knight of Destruction

Reper의 이미지

그렇군요.. 답변 감사합니다 !

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.