강의 설명

본 강의에서는 다음의 내용을 설명합니다.

  • 스택
  • 스택 프레임
  • 스택 연산: push, pop
  • 함수 호출: call, leave, ret
강의 목표
기본적인 x86-64 어셈블리어에 대한 이해
이 강의와 관련된 질문들입니다.
14개의 질문
어셈블리 call 질문
[Register] rip = 0x400000 rsp = 0x7fffffffc400 [Stack] 0x7fffffffc3f8 | 0x0 0x7fffffffc400 | 0x0 <= rsp [Code] 0x400000 | call 0x401000 <= rip 0x400005 | mov esi, eax ... 0x401000 | push rbp -------------------------------------- 여기서 아무리 봐도 결과가 왜 -------------------------------------- [Register] rip = 0x401000 rsp = 0x7fffffffc3f8 [Stack] 0x7fffffffc3f8 | 0x400005 <= rsp 0x7fffffffc400 | 0x0 [Code] 0x400000 | call 0x401000 0x400005 | mov esi, eax ... 0x401000 | push rbp <= rip -------------------------------------- 이런식으로 나오는지 모르겠습니다... code에 0x400000 | call 0x401000 이 실행되서 0x401000 | push rbp <= rip 여기로 온 것 까진 이해했는데 push rbp 다음부터 전혀 모르겠네요... 여기저기 찾아보니까 -8을 한다는데 왜 하는지도 모르겠습니다 제발 도와주세요...
#리버싱
메모리를 왜 뒤에서 부터 읽나요?
0x400500 | 0x3037207964343372 0x400508 | 0x003f367562336420 72 , 33 , 34 , 64 ... 이렇게 읽는 이유가 뭔가요??
#리버싱
#배경지식
Quiz: x86 Assembly 2 질문입니다
https://dreamhack.io/learn/quiz/25 [Code] main: push rbp mov rbp, rsp mov esi, 0xf mov rdi, 0x400500 call 0x400497 <write_n> mov eax, 0x0 pop rbp ret write_n: push rbp mov rbp, rsp mov QWORD PTR [rbp-0x8],rdi mov DWORD PTR [rbp-0xc],esi xor rdx, rdx mov edx, DWORD PTR [rbp-0xc] mov rsi,QWORD PTR [rbp-0x8] mov rdi, 0x1 mov rax, 0x1 syscall pop rbp ret 에서 rdi가 0x400500이니까 0x3037207964343372만 출력하는 거 아닌가요?
#리버싱
#배경지식
leave, ret 질문
<예제> [Register] rip = 0x401000 rsp = 0x7fffffffc3f8 [Stack] 0x7fffffffc3f8 | 0x400005 <= rsp [Code] 0x400000 | call 0x401000 0x400005 | mov esi, eax ... 0x401000 | mov rbp, rsp ... 0x401007 | leave 0x401008 | ret <= rip <결과> [Register] rip = 0x400005 rsp = 0x7fffffffc400 [Stack] 0x7fffffffc3f8 | 0x400005 0x7fffffffc400 | 0x0 <= rsp [Code] 0x400000 | call 0x401000 0x400005 | mov esi, eax <= rip ... 0x401000 | mov rbp, rsp ... 0x401007 | leave 0x401008 | ret 에서 명령어가 실행될 때 마다 어떤 일이 일어나는지 설명해 주실 수 있나요? 다 이해가 안 가서.. 죄송합니다.. +)수업에서 0x40100가 왼쪽 실습에선 mov인데 오른쪽 그림설명에서는 push여서.. 무엇이 맞는것인가요? https://learn.dreamhack.io/38#6
#리버싱
#배경지식
call,push 질문
[Register] rip = 0x400000 rsp = 0x7fffffffc400 [Stack] 0x7fffffffc3f8 | 0x0 0x7fffffffc400 | 0x0 <= rsp [Code] 0x400000 | call 0x401000 <= rip 0x400005 | mov esi, eax ... 0x401000 | push rbp 에서 궁금한 것이 있습니다. 1)rsp가 스택의 탑을 가리키는 것이라 알고있는데 왜 저기서는 탑(0x7fffffffc3f8)을 안 가리키는지 2)push만 했는데 왜 rsp가 가리키는 것이 달라지는지, 왜 push인데 쌓이는 데이터가 없는지 3)저기서의 mov는 왜 쓴건지 이해를 못하겠네요... 도와주시면 감사하겠습니다 제발...
#리버싱
#배경지식
Quiz: x86 Assembly 2 문제에 대한 질문입니다
https://dreamhack.io/learn/quiz/25 해당 문제를 보고 나름대로 해석해봤는데, 마지막 부분을 잘 모르겠습니다.. `push rbp rbp 생성 mov rbp, rsp rsp = rbp로 초기화 mov esi, 0xf esi = 0xf mov rdi, 0x400500 rdi = 0x400500 call 0x400497 <write_n> write_n 함수로 이동 psuh rbp rbp 생성 mov rbp, rsp rsp = rbp로 초기화 mov QWORD PTR [rbp-0x8], rdi [rbp-0x8] = 0x400500 mov DWORD PTR [rbp-0xc], esi [rbp-0xc] = 0xf xor rdx, rdx rdx = 0 mov edx, DWORD PTR [rbp-0xc] edx = [rbp-0xc] = 0xf mov rsi, QWORD PTR [rbp-0x8] rsi = [rbp-0x8] = 0x400500 mov rdi, 0x1 rdi = 0x1 mov rax, 0x1 rax = 0x1 syscall -> rax = 0x1이므로 write syscall을 요청 write(rdi, rsi, rdx) => write(0x1, 0x400500, 0) => 1바이트씩 0x400500주소부터 0개 읽음(?) `
#리버싱
#배경지식
assembly 퀴즈 질문
![](https://dreamhack-media.s3.amazonaws.com/attachments/99fcd8714db8f37b166403776a58421f6960ebf6d2d738b73826d0dfa101f117.png) 여기서 rdx 값이 어떤 것인지 어떻게 아나요 ? call 0x400497 <write_n> 전까지의 동작이 아래가 맞는지도 궁금합니다. esi = 0x0f rdi = 0x400500 (여기서 왜 source는 external이고 destination은 rdi인가요 ?) [Memory] 0x4004F8 | 0x400508 (rsp, rbp)
#리버싱
#배경지식
코드 메모리 주소 구분 질문입니다..!
[Code] 0x400000 | call 0x401000 0x400005 | mov esi, eax ... 0x401000 | mov rbp, rsp ... 0x401007 | leave 0x401008 | ret <= rip 프로시저 ret 설명에서 [Code] 부분 질문드립니다. 위의 코드의 첫번째와 두번째줄의 메모리주소를 보시면 0x400000 다음 0x400005이 나오는데 메모리는 한 주소당 8바이트의 공간이 있기 때문에 0x400000 다음에는 0x400008이 와야 되는거 아닌가용? 그리고 마지막 두개의 줄은 왜 0x401007 다음 0x401008이 오나요?
#리버싱
#배경지식
x86 Assembly 메모리 관련 질문드립니다.
[Memory] 0x400500 | 0x3037207964343372 0x400508 | 0x003f367562336420 만약 위와 같은 주소에 값이 있고 이 값을 1바이트씩 나눠보면 0x400500 | 0x72 0x400501 | 0x33 0x400502 | 0x34 . . 0x400507 | 0x30 0x400508 | 0x20 . . . 0x40050f | 0x00 이런 식으로 이해하는 것이 맞을까요?
#리버싱
#배경지식
스택프레임 생성
push rbp mov rbp, rsp 라는 어셈블리 코드가 스택프레임을 생성하는 코드라고 하는데 혹시 위 코드가 어떠한 방식으로 스택프레임을 생성하게 되는지 자세한 과정을 설명해주실 수 있나요.. 계속 생각을 해봐도 이해가 가지 않습니다.
#리버싱
#배경지식
rsp 값의 변화
Opcode: 프로시저 4페이지(https://learn.dreamhack.io/38#6)의 ```pop rip``` 실행결과의 ```rsp = 0x7fffffffc400``` 이어야 하는게 아닌가요?
#리버싱
#배경지식
x86-64 데이터 처리 단위
``` 0x401000: push rbp 0x401001: mov rbp, rsp 0x401004: sub rsp, 0x30 0x401008: mov BYTE PTR[rsp], 0x3 ... 0x401020: leave 0x401021: ret ``` "스택 프레임의 할당과 해제" 예시 코드에서 x64면 데이터 처리 단위가 64비트 = 8바이트 잖아요. 메모리 주소 단위가 바이트니까 코드 주소 0x401000다음 0x401001이 아니고 0x401008여야 하지 않나요?
#리버싱
#배경지식
stack의 push와 pop의 연산에 관해서 질문드립니다!
![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/68191e60594cf1711fbb9c2aae2fabb926357769a0c9df09953d93db9be59e98.png) ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/65cf2cbbcb2e0ca6087b0dfa9fe0bb5f85434fd86cd166b2b8c362db541d0c55.png) push 할 때, 왜 rsp -=8 인지 궁금합니다. 스택 최상단에 쌓는 것이니 rsp += 8 인 것아닌가요...? 그리고 앞선 강의에서 "메모리 피연산자는 []에 둘러싸여 표현된다" 라고 배웠는데, 이게 정확히 무슨 뜻인지 모르겠습니다... [rsp] = val 라는 예시를 기준으로, rsp가 가리키는 주소에 있는 값을 val을 대입해주는 건가요?
#리버싱
#배경지식
leave
leave 실행결과가 왜 저렇게 되는지 알 수 있을까요
#리버싱
#배경지식
강의 평점
0.0★ (0)
0
x86 Assembly🤖: Essential Part(2)
0.0★ (0)
Free
상세정보
약 30 minutes 소요
쉬운 난이도
없음