[2024.08.16]
[C Code]
[Assem Compile 32Bit]
# nasm -f elf32 hello.asm -o hello.o
# gcc -m32 -o hello hello.o
#apt-get -y install gcc-multilib
#apt-get -y install nasm
dev c++ 프로그램에서 Hello World를 출력하는 소스 코드를 생성한다
ollydbg에서도 파일을 열어 Hello World가 나오는 것을 확인하고 Kali Linux로 넘어간다
hello.c라는 파일을 생성하고
화면과 같이 입력해 주고 저장한다
파일명을 hello.asm으로 변경시켜 주고
필요한 개발 도구를 설치시킨다
어셈블리어로 작성된 hello.asm 파일을 32비트
ELF(Executable and Linkable Format) 오브젝트 파일로 컴파일하는 명령어다
해당 명령어를 실행시켜 준 다음
hello.o 오브젝트 파일을 32비트 실행 파일로
링크하여 hello라는 이름의 실행 파일을 생성하는 명령어로
해당 명령어도 실행시켜 준다
그런 다음 ./hello를 하게 되면 Hello World가 정상적으로 출력되는 것을 볼 수 있다
다시 dev c++로 넘어와서 이번에는 if문을 생성한다
값이 30이 나오도록 코드를 생성하고 저장
ollydbg로 파일 확인 시 401500 라인에서 시작되는 것을 확인할 수 있다
마찬가지로 실행시키게 되면 30이라는 값이 출력된다
여기에서 값을 10으로 출력되게끔 만들려면 해당 코드를 조작하여 변경시킬 수 있다
현재 401516 라인에서 0A라고 되어 있는 곳을 1E로 변경시키고 저장한다
*현재 체크되어 있는 것을 다 해제시켜야 저장된다
그런 다음 나머지도 실행시키면 10이라는 값이 저장되었기 때문에 10이 출력된다
이번에는 결과값이 10으로 나오도록 if문을 수정시키고 저장 후 확인한다
ollydbg로 확인하고, 항상 같은 라인에서 시작되는 걸 확인할 수 있다
정상적으로 한 번 실행하게 되면 10이라는 결과값을 제대로 나타낸다
이번에도 코드를 조작하여 30이라는 값으로 변경시킬 수 있는데,
현재 40151B라인에서 JE로 시작하는 점프 구간을 JNE로 변경시키면서 값이 30으로 변경된다
NOT이 들어갔기 때문에 결과값이 10이 될 수는 없다
변경시킨 후 실행하면 30이라는 결과값을 받을 수 있다
이번에는 다른 방법으로도 조작이 가능한데
현재 라인에 와서 레지스터의 Zero Flag 값이 0으로 설정되어 있다
그런 Zero Flag는 CPU의 상태 레지스터(또는 플래그 레지스터)의 일부이며,
CPU가 명령어를 실행한 후 결과가 0인지 아닌지를 나타내는 플래그이다
두 번 클릭하면 1로 설정이 되는데, 그 값을 수동으로 변경함으로
프로그램의 실행 흐름을 조작할 수 있다
ex) 예를 들어, 조건문에서 특정 조건이 충족되지 않아도 강제로 그 조건이 충족된 것처럼 만들 수 있다
그렇게 Zero Flag를 변경하고 실행하면 30이라는 변경된 결과값을 얻을 수 있다
강의 소감
Windows 10에서 dev c++, ollydbg 프로그램만 사용하다가
오랜만에 Kali Linux를 통해 소스 코드의 값을 출력하는 실습을 진행했다
또한, if문을 통해 결과값을 출력하고 그 if문의 코드에서
조작 후 결과값을 변경시키는 것도 연습했다
아직 printf의 경우 헷갈리는 부분이 많지만 계속 실습을 통해 보완해 나가야 될 점이다