학습내용: 달고나 문서 ~p.27까지
달고나 문서의 처음부터 27페이지까지 각자 학습하고, 학습 내용을 공부하고 모르는 질문을 정리하였다.
<손슬리>
Q1. p.20에 sub명령어와 push명령어 용법이 왜 인터넷&수업자료와 다 반대일까? sub 명령어는 sub [option2][option2] 면 obtion1=obtion1-obtion2라고 하는데 설명은 왜 반대인건가?
A. CPU 제조 회사에 따라 문법이 다르다.
(리눅스) AT&T : 명령어 [source] [destination]
(윈도우) Intel : 명령어 [destination] [source]
예시 : eax에서 ebx 레지스터로 데이터를 복사하는 경우
AT&T : movl %eax, %ebx
Intel : mov ebx, eax
참고 :http://doc.kldp.org/KoreanDoc/html/Assembly_Example-KLDP/Assembly_Example-KLDP.html
<박슬리>
Q1. Kernel 영역이 Low address 쪽에 위치해있는데, 다른 자료들을 보면 커널 영역은 높은 주소에 위치하고 다른 프로그램들의 커널 영역 침범을 방지하기 위해서 스택이 높은 주소 > 낮은 주소로 자란다고 한다. 왜 달고나 문서는 반대로 되어있는가?
A. 해결 X. 교수님께 문의 드릴 예정.
Q2. p.13에서 .file, .text 같이 .이 붙는 것들은 변수인가?
A. file 지시자는 일반적으로 디버거에서 사용하는 원본 소스 파일 이름을 가리킨다. .text 섹션은 프로그램 코드를 실행할 때 사용한다. (불확실, 확인 필요)
Q2-1. 섹션과 세그먼트의 차이는?
A. 섹션은 실행 가능한 파일(ELF) 속의 나눈 부분, 세그먼트는 프로그램이 load 될 때, 즉 실행 중에 나눈 부분이다. (불확실)
Q3. p.13에서 push, mov, sub와 같은 명령 뒤에 l이 붙은 것은 왜인가?
A. 간단한 차이이다. 저러한 명령어 뒤에 쓰이는 l, b, w는 오퍼랜드의 크기를 지정하는 것이다.
예시 :
movl : 32bit
movw : 16bit
movb : 8bit
<문슬리>
Q1. p.5에서 code segment 명령 수행할 때 분기가 일어나는 이유는?
A. 분기는 선택적으로 코드를 실행시킬 수 있는 것을 말함. 밑의 사진에서 MOV 자리에 들어가는 것이 명령어. 분기는 JMP, JNE, JE 같은 분기 명령이 MOV 자리에 들어갔을 때 분기가 일어나는 것. 꼭 분기가 아니어도 명령어에 따라 시스템 호출, 점프 등이 일어날 수도 있다.
Q2. p.9에서 EBX와 ESI의 차이점은?
A. 둘 다 범용 레지스터이다. 다만 EBX는 데이터 레지스터이고 ESI는 인덱스 레지스터이다.
인덱스 레지스터는 범용 레지스터 범주에 속하지만 주로 데이터가 저장되어 있는 메모리 주소를 가리키는 포인터로 사용된다. ESI는 데이터를 조작하거나, 복사할 때 데이터의 주소가 저장되고 EBX 레지스터는 메모리 주소를 저장하기 위한 용도로 사용된다. 따라서 EBX가 데이터를 지시할 때 ESI와 결합하여 사용될 수 있다.
Q3. p.11에서 PF와 ZF가 무엇인가?
A. PF는 Parity Flag로 연산 결과 1의 개수가 짝수일 경우에 최하위 비트 값이 1이 된다. 패리티 체크를 하는데 사용된다. ZF는 Zero Flag로 연산의 결과가 0일 때 설정된다. 두 값을 비교하여 같은 경우 1이 되고, 같지 않은 경우 0이 된다. 연산 결과 0으로 되었을 때 1로 set, 그 외에는 0으로 리셋된다.
<부록>
패리티 비트 : 정보의 전달 과정에서 오류가 생겼는지 검사하기 위해 추가된 비트이다. 전송하고자 하는 데이터의 끝에 1비트를 더하여 전송하는 방식으로 홀수 패리티, 짝수 패리티의 2가지 종류가 있다. 홀수 패리티는 1의 갯수가 홀수개가 되도록, 짝수 패리티는 1의 갯수가 짝수개가 되도록 하며 송수신할 때 이를 미리 정하여 보낸다.
Q4. p.20에서 PUSH는 쌓는 것인데 왜 4바이트 아래를 가리키나?
A. stack pointer가 ESP이고 base pointer가 EBP인데, EBP를 위에서 PUSH 하므로 4바이트만큼 눌려서 아래로 내려가게 된다.
Q5. p.23 마지막 문장을 모르겠다.
A. push %ebp, mov %esp, %ebp가 함수 프롤로그의 한 세트이다. 이를 function()에 적용해보면, function()은 main() 다음에 온다. 따라서 이전 함수인 main()의 base pointer가 저장되고 (push %ebp), main()에서 사용하던 ESP를 이제 사용할 function()의 EBP에 복사한다 (mov %esp, %ebp), => function()의 프롤로그 과정을 써놓은 것.
<이슬리>
Q1. p.4에서 "기본적으로 커널은 64 KByte 영역에 자리잡지만" 이라고 써있는데, 64KByte 영역이 어디인가?
A. 해결 X. 교수님께 문의 드릴 예정.
Q2. p.24의 아랫부분에서, "그리고 function 함수의 인자는 function() 함수의 base pointer와 return address 위에 존재하게 된다. 이것은 그림 13에서 보는 바와 같이 main 함수가 호출될 때 주어지는 인자 argc, argv가 위치한 곳과 같은 배치를 갖고 있다. 어떤가? 이제 그림 13이 이해가 되지 않는가?" 배치가 어디가 같아 보이는지 모르겠다.
A. 스택 세그먼트 내에서의 배치 형태가 main 함수와 function 함수가 유사하다. main 함수의 인자 argc, argv가 위에 쌓이는 것처럼 function 함수의 인자도 같은 구조로 쌓이게 된다. (불확실, 확인 필요)
<오슬리>
Q1. p.12에서 gcc의 -S 옵션이 무엇인가?
A. -S 옵션은 어셈블리 파일을 생성하는 옵션이다.
참고 :https://devanix.tistory.com/169
Q2. p.19에서 ESP가 가리키는 것이 SS의 맨 윗부분인데, "POP 명령이 ESP가 가리키는 지점의 데이터를 가져갈 것인지 ESP가 가리키는 지점 위의 데이터를 가져갈 것인지"라는 문장에서 ESP가 가리키는 지점 위의 데이터가 존재하는가?
A. 프로그램의 초기가 아닌 계속 프로그램이 수행되며 ESP가 가리키는 부분도 바뀌므로, ESP 지점 위의 데이터가 존재할 수 있다.
Q3. p.24에서 function()의 프롤로그를 실행하면 왜 0x80482f7이 나오는 것인가?
A. 나중에 따로 조사할 예정.
<다음 주 계획>
1. 달고나 ~p.27까지 복습
- 복습하는 만큼 더 꼼꼼하게 정리, 이해하기.
2. pwnable.kr BOF 부분(너구리) 3번 문제 풀기.
- 못 풀어도 해설 보고 쓰이는 개념과 문제 구조 설명하기.
'3. Pwnable (포너블) > 2) 개념 정리' 카테고리의 다른 글
[2020.11.07] 4너블4ever - 달고나 문서 44p~57p (0) | 2020.11.07 |
---|---|
[2020.9.19] 4너블4ever - 리눅스 기초 명령어 + 달고나 문서 ~p12 (0) | 2020.09.20 |
[2020.05.19] pw.Sly - 달고나 문서 p44~p57 (0) | 2020.05.23 |
[2020.05.12] pw.Sly - 달고나 문서 p27~p44 (0) | 2020.05.23 |
[2020.04.07] pw.Sly - 달고나 문서 ~p27 (2) (0) | 2020.04.26 |