in_out
어셈블리어 전체 직역
1. EBP 값을 스택에 저장
이전 스택 프레임의 ebp 값 저장 (다시 돌아가기 위함)
2. ESP 값을 EBP 에 저장
새 스택 프레임의 처음 위치 설정 (이 시점에 esp 는 이전 스택의 마지막 값이므로 여기부터 새 스택 프레임을 설정)
3. ECX 값을 스택에 저장
ECX는 반복할 때 사용한다고 함
4. 00FE3000 을 스택에 저장
(중간에 껐다켜서 주소가 변경되었습니다)
00FE3000에 저장된 값을 스택에 저장
널바이트 (’\0’)를 만날 때까지 저장이므로 20 3A 20 (공백 : 공백) 까지 저장됨
근데 여기까지 진행하면서 스택에 데이터가 저장됨에 따라 esp 값이 계속 바뀌는걸 확인할 수 있다
5. 013910C0 호출 (다시 껐다 켰습니다..)
printf로 추정 - 그전에는 없었는데 호출하니까 “숫자를 입력하시오 : “ 가 나옴
6. ESP + 4의 값을 ESP에 저장
스택정리 (+4를 해서 esp 값을 높은 주소로 변경, push 1번 했으니까 +4)
7. EBP - 4 의 주소를 EAX에 저장
8. EAX 값을 스택에 저장
9. 01393018 을 스택에 저장
%d를 스택에 저장
10. 01391100 호출
scanf로 추정 (%d를 사용하는 입력스트림, 그전까지는 입력이 안 되다라 해당 주소 호출하니 입력이 됨)
11. ESP + 8을 ESP 에 저장
스택 정리 (push 2번 했으니 +8)
12. EBP - 4의 값을 ECX에 저장
13. ECX 값을 스택에 저장
14. 0139301C 를 스택에 저장
15. 013910C0 호출
printf 호출
16. ESP + 8 을 ESP 에 저장
스택 정리 (push 2번해서 +8)
17. EAX와 EAX 의 XOR 값을 EAX 에 저장
연산이 끝났기 때문에 EAX는 0으로 초기화 해줌
18. EBP의 값을 ESP 에 저장
새 스택 프레임의 시작지점 값을 ESP 에 저장함으로써 EBP 와 ESP 값을 일치시킴
이 때 해당 위치의 값으로는 맨 처음에 push로 넣었던 기존 스택 프레임의 시작 위치가 들어있음
19. 스택 최상단의 값을 EBP에 저장
스택 최상단에는 맨 처음 넣었던 기존 스택 프레임의 EBP 값이 들어있음
해당 구문을 실행함으로써 기존 스택프레임의 형태로 돌아감
이때 esp도 맨 처음 값으로 바뀐다
완전히 처음으로 돌아가는 것
20. 리턴 (이전에 호출된 주소로 되돌아감)
호출됐던 곳으로 리턴
분석한 것을 기준으로 C 소스코드 만들기
#include <stdio.h>
int main(void) {
int num;
printf("숫자를 선택하세요 : ");
scanf("%d", &num);
printf("입력한 숫자는 %d 입니다", num);
}
C
복사
in_out2 분석
어셈블리어 전체 직역
puts 쓰기전에 저장하는 데이터에 공백을 널바이트로 변경하면 정상동작
PUSH 된 EDX 값을 61 → 63으로 변경하면 c로 출력됨
결과
분석한 것을 기준으로 C 소스코드 만들기
#include <stdio.h>
int main(void) {
char str;
printf("문자를 입력");
puts("하시오 : ");
scanf("%c ", &str);
printf("입력한 문자는 %c (아스키코드 %d) 입니다", str);
}
C
복사