정리할 일이 있어서 한번 정리해 보았다.
Register
- GPR : 변수와 같은 느낌
- ax, bx, cx, dx
- di, si
- SPR : 목적이 중요함
- bp (base pointer) : 지역변수
- sp (stack pointer) : 함수를 효율적으로 사용하기 위해
- ip (PC) : 현재 실행 위치
Intel
* little endian : 전력이 많이 소모되나, 속도가 빠름 <-> big endian : ex) ARM
* Windows : PE 포맷, PE파일의 시그니쳐는 MZ
* Linux : ELF 포맷
text -----> object -----> ELF
compile Linking
calling convension : 기본적이라 의미 없는 것들
마지막에 지역변수 없으면 leave가 아니라 pop 사용 (leave = push + mov)
괄호 [,]가 있으면 무조건 포인터
POP 뒤엔 항상 call이 나옴
1. ebp 변수
2. esp 반드시 call이 나옴, 함수 인자를 셋팅함 // esp나오면 call 기준으로 거꾸로 읽으면 인자 순서가 됨
3. ret은 ax에 있음 (ret = pop eax?)
Segment를 나눴다고 함 (Segmentation, 제대로 가리키지 않았을 때 Segmentation Fault)
stack (위에서 아래로) : 변수 <- bp or sp
data (아래에서 위로) : 변수 <- bp
code (text) : paging 사용 <- ip
Segment Selector
cs : 0x0 ~ 0xffff
ds : 전역변수
ss
gs : windows
fs : linux
es : 마음대로
fs : 0x0 은 PID 의미함
fs : 0x28 은 Random 의미함
ebp - 0x4 : 지역변수 (v4)
ebp + 0x8 : 인자 (a1,a2,a3,...)
<- esp
ebp(sfp) <- ebp
ret +4
1 (a1) +8 : ebp+4는 무조건 retrun이므로 인자는 무조건 ebp+8부터 존재함
2 (a2) +12 (0xc)
(a3) +16(0x10)
(a4) +20(0x14)
lea op1, [op2] = mov op1, op2
64bit에서 rsi는 첫번째 인자, rdi는 두번째 인자
IDA
* Imports : 내가 가져온 라이브러리
* Exports : 내가 내보내는 것
C++
v3는 객체이며, 메소드를 부르는 c++코드가 IDA에서는 이렇게 나타남
v3[3](v3);
*a1=v3
list 탐색같은 익숙한 코드들을 IDA에서 볼 수 있어야함
IDA structures에 구조체를 만들어서 사용하고 적용할 수 있어야함
canary 박혀 있는 것을 알 수 있음 : __readgsword / gs
리눅스 info proc 명령어
'STUDY' 카테고리의 다른 글
보안 챌린지 사이트 (0) | 2019.12.13 |
---|---|
heap 공부 시 참고링크 정리 (0) | 2019.12.12 |
Docker 명령어 (0) | 2019.10.07 |
HITCONTraining lab12 secretgarden (0) | 2019.10.07 |