2번도 풀어보자
함수를 살펴보니 func함수와 main함수를 중점으로 보면 좋을 것 같다.
메인함수
먼저 맨 앞 두줄은 함수 프롤로그이고
mov DWORD PTR [rbp-0x4], 0x0 이거는 처음에 변수를 정해주는 것 같다.
mov edi 0x4006c4
뒤에 있는 주소가 뭔지 모르겠어서 아래 사진처럼 직접 확인을 해보니까
"점수를 입력하세요 : " 이거였다.
이게 프린트 되게끔 printf 함수를 불러왔다.
그리고 lea rax, [rbp-0x4]
rbp-0x4에 저장된 주소를 rax에 저장한다.
mov rsi, rax
rsi에 rax(rbp-0x4 주소)값을 넣고
mov edi, 0x4006e1
아래를 참고하면 뒤의 값은 %d이다.
mov eax, 0x0 이렇게까지 해주면
scanf를 호출한다. 그러니까 내 생각에는 scanf("%d", eax에 저장되는 변수)
이게 아닐까!
mov eax, DWORD PTR [rbp-0x4]
mov edi, eax
해주고 func 함수를 불러온다. main+57까지 일단 살펴보았다.
func 함수를 잠시 살펴보고 오자
함수 프롤로그 거치고 살펴보니..
많은 cmp와 jle jmp가 있다.
먼저 DWORD PTR [rbp-0x4]를 0x59와 비교한다. 아까 스캔받은 점수랑 비교한다는 것인듯!
0x59는 10진법으로 89이다. 아래 cmp에 나오는 숫자는 차례대로 변환하면 79, 69, 59 이다.
jle 0x4005aa 이것은 위에 비교한게 왼쪽이 작거나 같으면 저기로 점프하라는 뜻이다.
예를 들어 스캔받은 점수가 80점이라면?
80 < 89니까 func+20으로 점프할 것이다.
만약 점프하지 않았다면(스캔받은 점수가 89점 초과였다면) eax에 0x41 즉 A값을 저장하여 맨 끝으로 이동할 것이다.
우리는 일단 80점이라고 가정했으니까 func+20으로 이동해보자.
또 80점과 79점을 비교해보자
이번엔 80이 더 크다. 그러면 점프하지 않고 eax에 0x42 즉 B를 넣고 func 함수 끝으로 이동할 것이다.
다시 메인함수로 돌아와서!
eax에는 지금 B가 들어있을 것이다. 그리고 esi에 eax값 즉 B를 넣고
edi에는 0x4006e4 아래 사진 참고하면 "%c 등급입니다.\n"이라는 뜻이고 암튼 이걸 넣어주고
eax는 0으로 바꿔준다.
그리고 프린트를 해준다!
그러니까 printf("%c등급입니다.\n", esi에 있는 값);
이런 뜻이지 않을까
이러고 함수 끝!!!!
실행을 해보니 점수 입력 받고 그에 대한 등급을 출력해주는 함수 맞다 맞아!!!!!!!
그래서 소스코드를 다음과 같이 짰고(이상하게 한글 지원이 안된다..ㅜ)
컴파일 하고 실행해보니 잘 나온다.
#include <stdio.h>
char func(int score){
if(score>=90){
return 'A';
}else if(score>=80){
return 'B';
}else if(score>=70){
return 'C';
}else if(score>=60){
return 'D';
}else{
return 'F';
}
}
int main(){
int score = 0;
printf("점수를 입력하세요 : ");
scanf("%d",&score);
printf("%c 등급입니다.\n",func(score));
return 0;
}
이게 답인데
89보다 작거나 같으면 점프하라는 뜻이니까 90점 이상이어야 A등급을 받는것이구나..
그쵸.. 맞네용 그래서 if문은 각각 그렇게 수정해주면 될 것 같고
메인함수에서 역시나 grade라는 변수를 따로 설정하지 않고 바로 함수를 실행했다.
방금 잘못한걸 또 잘못했다.
그리고 score 초기화도 안해줌 ㅎㅎ 이런 것들을 보완하면 되겠다.
'HACKING > SYSTEM' 카테고리의 다른 글
Buffer Overflow 취약점 (BOF) _ 지역변수를 임의의 값으로 overwrite (0) | 2021.09.25 |
---|---|
Buffer Overflow 취약점 (BOF) _ memory leak (0) | 2021.09.24 |
pwntools 기본 명령어 (0) | 2021.09.24 |
어셈블리 핸드레이 1 (0) | 2021.09.07 |
CVE-2019-17320 | 넷사랑 XFTP Client 버퍼오버플로우 취약점 (0) | 2021.08.31 |