-
소프트웨어 역공학 실습 GDB exam1, exam1-1여러가지 공부 2022. 4. 20. 10:01
exam1
PUSH: 스택에 데이터를 삽입POP: 스택에서 데이터를 꺼냄
- 스택에서 4바이트를 꺼내와 지정한 레지스터에 삽입

exam1 vi 코드 위와 같은 코드를 실행해보았다.

nasm NASM을 사용해준다.
*NASM 이란? 어셈블러를 컴파일해주는 도구
*NASM 프로그램 구조
- 지시자: 코드에서 사용할 섹션, 외부에서 참조할 함수 이름을 선언
- 명령어: 어셈블리어 명령어 세트
- 피연산자: 메모리, 레지스터. 데이터
- 섹션: 하나의 작업을 위한 어셈블리어 코드 모음

NASM을 사용하여 컴파일을 해준 다음 GDB로 파일을 열어본다.
set disassmbly-flavor intel을 쳐서 intel로 보기 편하게 해 준다.
이후 main을 보면 위와 같이 있다. 실행을 해보겠다.

main에 beackpoint를 걸어주고 run을 하여 실행하여 준다.
그럼 화살표가 나오고 실행을 할 준비가 되었다고 한다.

이후 ni 명령어를 사용하여 각 줄을 실행을 해준다. 위는 push를 두 번 실행 해준 다음 화면이다.
push를 실행했을 때는 info reg에 값의 변화가 없다.

POP 줄을 ni로 실행한 후 info reg를 보면 eax 레지스터의 값이 바뀐 것을 볼 수 있다.
왜? POP은 스택에서 4바이트를 꺼내와 지정한 레지스터에 삽입을 하기 때문이다

이후 남은 한 줄을 더 실행을 한 화면이다. 그럼 위와 같이 POP을 통해 ebx의 값도 바뀐 것을 확인할 수가 있다.
exam1-1
Segmentation Fault
- 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나. 잘못된 방법으로 메모리 영역에 접근을 시도할 경우 발생
- 내 영역을 넘어가 버렸다는 것은 프로그래머가 생각하지 못한 사용자 입력 값이 있었다?
- 그냥 프로그램을 잘못 짰다.
- 우리 프로그램의 문제는 바로 '끝맺음'을 제대로 하지 않은 것
MOV: 데이터를 복사하는 것
복사
- 레지스터 -> 레지스터
- 메모리 <-> 레지스터
이번에 실습을 해볼 mov 코드이다.

아까와 같이 컴파일 부분은 건너뛰고 컴파일을 한 다음 gdb로 파일을 열어본다

그럼 위와 같이 나온다 breakpoint를 이번에도 main에 걸고 실행을 해보겠다.
2번 줄까지 실행해본 다음 info reg로 확인해본 다음 mov 명령어의 바뀐 결과 값을 봐보겠다.

push 까시 실행 후 info reg의 화면이다. mov 줄을 실행 해 보겠다.

eax 값이 바뀌었다. 왜? mov 명령어가 실행이 되었기 때문이다.
코드를 봐보면 mov eax, ebx라고 있는 부분에서 실행이 되면서 바뀐 것인데 ebx 값이 eax로 복사하면서 데이터를 집어넣은 것이다. 그래서 ebx의 0x0 값이 eax로 복사하면서 집어넣었기에 위와 같은 결과가 나온 것이다.

main을 보면 9번 줄을 실행했는 결과이다. 앞에 말한 것처럼 0xbffff098이 ebx에 복사하면서 데이터를 집어넣었기에 ebx의 값이 바뀐 것을 볼 수 있다.

남은 한 줄을 실행한 결과이다. 앞에 있었던 부분과 다르게 DWORD PTR이 들어가 있다. 이것은 대괄호 안에 있는 ebx의 주소 값에다가 0x10을 집어넣겠다는 것이다. 이것을 이해하는데 오래 걸렸는데 조금 비유를 하자면 [ebx]는 주소이다. 즉 이것은 컵이라고 생각을 해보자. 그리고 뒤에 0x10은 값이다. 즉 물이라고 생각을 하자. 그러면 주소에 0x10이라는 값을 집어넣는 것이다. 비유를 하자면 ebx라는 컵이 있다. 여기에 0x10이라는 물을 집어넣은 것이다. 그래서 위와 같은 결과 값이 나오는 것이다.
이상 실습 끝
'여러가지 공부' 카테고리의 다른 글
26살 첫 취업, 사회생활 시작 (15) 2023.12.15 네트워크 분석 실무 중간고사 정리 (0) 2022.04.20 소프트웨어 역공학 시험 정리 (0) 2022.04.19 네트워크 VPN (0) 2022.04.18 소프트웨어 역공학 3주자 (0) 2022.04.18