일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- GeoJSON object too complex/large
- react
- 김골라
- EC2
- AWS
- 어셈블리어
- NODE_VERSION
- ERR_PNPM_NO_GLOBAL_BIN_DIR
- expo
- S3
- 이미지 좌표 추출
- credential error
- SASS
- Error:error:0308010C:digital envelope routines::unsupported
- Sequelize Error: Dialect needs to be explicitly supplied as of v4.0.0
- 이미지 맵
- 반응형 페이지 좌표 변환
- AWS CodePipeline
- Unable to find the global bin directory
- netlify variables
- AWS CodeBuild
- nodejs
- C언어
- aws ec2
- CSS
- ogr2ogr
- can't getting credentials
- node
- rwdImageMaps
- 설치완료안됨
- Today
- Total
ImFe's study
어셈블리 코드 해석 본문
스택 프로텍터들을 사용하지 않는 옵션들입니다.
프로그램 동작에 따른 스택의 변화는 대강
버퍼 |
변수c |
EBP(RBP) |
RET |
이렇게 main함수에서 sum()을 호출한 이후
버퍼 |
RBP |
RET |
변수 = 2 |
변수 = 1 |
버퍼 |
변수c |
EBP |
RET |
버퍼 위에 스택이 쌓이게됩니다.
매개변수들은 RET 아래에 들어가게됩니다.
또한 sum을 다 실행하면 RET를 통해 변수1부터 최상단 버퍼가 사라집니다(POP)
더 자세히 알아보면
main 함수가 불러와지자 ret가 일단 자리를 잡습니다.
main:
push %rbp를 통해 rbp를 지정합니다.
mov %rsp, %rbp // %rsp=%rbp
sub $16, %rsp //rsp에서 16만큼을 뺍니다. = 16만큼 확보후 코드를 작성할 계호기
mov $2 %esi //esi에다가 2를 넣습니다.
mov $1 %edi //edi에다가 1을 넣습니다
call sum //sum을 불러옵니다.
sum:
함수단에서 push %rbp로 인해 ret위에 rbp가 올라갑니다.
mov %edi -4(%rbp)=> rbp-4값에 edi값을 넣습니다. (절대위치상승)
=>EDI 값은 원래 1이였으니까 rbp에서 -4위치에 EDI를 MOV
mov %esi -8(%rbp) => rbp-8 위치에 esi 값을 넣습니다. (절대위치 상승)
=esi값은 원래 2였으니까 rbp에서 -8위치에 ESI mov
mov -4(%rbp), %edx // rbp-4에 위치한 1값을 EDX에 넣어줌.
mov -8(%rbp), %eax // rbp-8에 위치한 2값을 EAX에 넣어줌
add edx,eax //edx의 값을 eax에 더해줌
//eax=3 (특정 함수가 끝날때 반환값을 가지고 있는 레지스터)
pop rbp=>원래값으로 돌아감. ret로 간다
다시 main함수로 돌아가서..
mov %eax, -4(%rbp) // eax값을 rbp-4에 둠
leave
ret
최종적으로 3이라는 값이 반환됩니다.
'Reversing' 카테고리의 다른 글
스택, 함수에필로그, 프롤로그 (0) | 2020.05.19 |
---|---|
InstructionCycle, 레지스터, 함수호출규약, DataSize, FLAGS, Instruction Format (0) | 2020.05.14 |
리버스 엔지니어링이란 (0) | 2020.05.14 |
어셈블리어 (0) | 2020.04.12 |
어셈블리어로 Hello world 출력하고 디버깅해보기 (0) | 2020.04.11 |