본문 바로가기
STUDY

리버싱 기초

by CH@3M 2019. 10. 14.

정리할 일이 있어서 한번 정리해 보았다.

 

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