Search

in_out, in_out2 분석

카테고리
[실습] 리버스 엔지니어링
상태
완료
게시일
2024/04/17
태그
리버싱

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
복사