Homework2
먼저 i fu로 함수목록을 확인함
이전문제와 비슷하게 main -> func로 추정
main함수의 구조를 보니 호출규약이 x64 fastcall 인듯하다.
그리고 0x4006c4에 있는 문자열인 "점수를 입력하세요 : " 를 매개변수로하여 printf 함수를 호출하고
scanf함수로 정수를 입력받고 func함수의 리턴값 문자로 "%c 등급입니다. \n" 를 출력하는것으로 예상됨.
그리고 printf 앞에 mov DWORD PTR[rbp-0x4], 0x0 은 int 형 변수를 선언하고 초기값0을 할당하는듯.(근데 scanf에서 쓸건데 굳이 0으로 초기화를 해준건지 int형 변수 선언만하고 초기화를 안해도 기본값이 0인지 쓰레기값인지 컴파일러에 따라 다른것같같은데 그건 모르겠고 그냥 0으로 선언했다고 가정)
즉 int num = 0;
그리고 printf 함수 종료후 바로 lea rax, [rbp-0x4] -> mov rsi, rax 하는것으로봐서 저 방금선언한 num의 주소값을 scanf의 매개변수로 넘겨주는것을 확인
그다음으로 mov edi, 0x4006e1 는 두번째 매개변수 "%d" 를 edi 레지스터에 넣어주는것으로 확인할 수 있음(fastcall)
즉 scanf("%d", &num);
scanf함수에서 90을 넣어준 직후의 모습이다.
rbp-0x4 에 있는 값 90을 eax에 넣어주고, eax를 edi 에 넣어주는데 이게 func함수호출을 위한 매개변수 일 것이다
즉 func(num);
다음으로 func함수로 들어가보았다.
scanf함수에서 넣어준 입력값 90(0x5a) 를 [rbp-0x4]에 넣고 0x59와 비교하여 작거나 같으면 func+20 으로 가고 아니면
mov eax,0x41 을 하고 func+64로 점프하는것을 확인할 수 있다.
여기서 0x41은
문자 A이다.
그리고 func+64로 점프해보면
바로 종료해버리는걸보니 아까 mov eax,0x41 이게 return 'A'; 라는것을 알 수 있다.
그러므로 일단 if(num > 89) return 'A';
다른분기문들은 일일히 재실행해서 입력값 바꿔넣기 귀찮으니까 그냥 pd func만 보기로했다.
이걸로 분석해보니
89보다 작거나 같으면 func+20으로 가서 0x4f(79) 와 비교해서 작거나 같으면 func+46으로간다. 이런식으로 0x46(69), 0x3b(59)와 비교해서 'C', 'D'를 리턴하고 모두 분기되지않으면 mov eax,0x46(F) 를 리턴한다.
즉
if(num > 89){
return 'A';
}else if(num > 79){
return 'B';
}else if(num > 69){
return 'C';
}else if(num > 59){
return 'D';
}else{
return 'F';
}
이다
이제다시 디버깅으로 돌아가서 func함수 리턴 직후로 들어가보았다.
rax 에는 리턴값 A가 들어있다.
여기서 바로 movsx eax,al 가 나오는데 movsx와 al 이 뭔지는 자세히 모르겠지만 진행해보아도 eax값은 0x41로 그대로이고 부호가 있는 정수에 사용한다고하니 일단 unsigned char가 아닌 그냥 char 라는것정도로만 이해했다.
그런데 이 리턴값으로 따로 변수를 할당하지 않고 바로 esi에 넣고 아까확인한 0x4006e4에 있는 "%c 등급입니다.\n" 를 edi에 넣어주는것으로 보아 printf("%c 등급입니다.\n", func(num)); 이런 구조일 것 같다.
그리고 출력후 바로 return 0;로 종료된다.
#include<stdio.h>
char func(int num){
if(num > 89){
return 'A';
}else if(num > 79){
return 'B';
}else if(num > 69){
return 'C';
}else if(num > 59){
return 'D';
}else{
return 'F';
}
}
int main(){
int num = 0;
printf("점수를 입력하세요 : ");
scanf("%d", &num);
printf("%c 등급입니다. \n", func(num));
return 0;
}
'Pwnable' 카테고리의 다른 글
[Pwnable] Format String Bug (0) | 2022.02.23 |
---|---|
Pwnable 환경 세팅 (0) | 2021.09.23 |
Assembly Handray (0) | 2021.08.24 |