본문 바로가기
Reversing

[리버싱] 어셈블리로 Hello, World! 변경해보기

by 태균맨 2025. 10. 1.

https://tkman.tistory.com/14

 

[리버싱] x64dbg로 Hello World! 리버싱 해보기

1. 준비 : x64dbg 설치 및 Hello World 컴파일 해당 링크에서 다운로드 할 수 있다. 32비트/ 64비트 모두 지원한다.https://x64dbg.com/ x64dbgBuilt on open-source libraries x64dbg uses Qt, TitanEngine, Zydis, Yara, Scylla, Jansson,

tkman.tistory.com

이전 게시글에 이어서...

 

1. 메모리 값으로 변경해 보기

 

이 부분이 printf("Hello, World!") 라는 것을 알았으니 이걸 수정해 보기로 한다.

lea rcx, ds:[0x00007FF6426CAC28]

 

어셈블리어를 분석해 보니 0x00007FF6426CAC28 의 주소를 rcx에 담는다고 한다.

 

아래 [덤프 1] 메뉴에서 컨트롤 G를 눌러 찾아가 본다.

 

 

Hex탭엔 16진수로 나오지만 아스키 탭을 보면 Hello, World! 라고 나온다.

이 부분을 대충 수정해 보자.

간단하게 Hello => HHHHH 로 변경하였다

 

F8를 눌러 브레이크 포인트 이후에 printf 함수까지 실행해 보면

(F8 : 한 줄씩 읽기)

 

문자열 변경에 성공했다.

 

하지만 어셈블리로 변경한 게 아니라, 단순히 메모리 값을 변경했다.

단순한 변경은 가능하지만 정적 구조로 문자열 개수 등 복잡한 수정은 불가능하다.

 

2. 어셈블리로 포인터 다른 주소로 바꿔보기

lea rcx, ds:[0x00007FF6426CAC28]

 

그럼 여기서 0x00007FF6426CAC28 를 다른 주소로 변경하면 어떻게 될까?

 

여기 마침 다른 문자열이 있으니 변경해 보자

 

lea rcx, ds:[0x00007FF6426CAC28] => lea rcx, ds:[0x00007FF6426CAC88]

 

[Hello, World!]가 [Stack around the variable ' ]로 변경되었다.

(참고로 메모리값에서 00 까지만 출력된다. 참고로 스페이스바는 0x20 으로 표현됨)

00을 만나서 여기까지만 출력

 

 

그럼 좀 더 긴 주소를 넣어보자.

lea rcx, ds:[0x00007FF6426CAC28] => lea rcx, ds:[0x00007FF6426CAD20

 

이런 식으로 긴 문자열이 나오게 된다.

 

3. 코드 케이브(Code Cave)로 문자열 만들기

 

이런 빈 곳을 찾아서 문자열을 입력해 보자.

우클릭 바이너리 편집기 - 편집

 

lea rcx, ds:[0x00007FF6426CAC28] => lea rcx, ds:[0x00007FF6426CA868

 

0x00007FF6426CA868 를 덮으면

 

 

이렇게도 수정 가능하다.

 

4. 코드 케이브(Code Cave)로 어셈블리 만들어보기

 

이 방법을 이용해서 어셈블리도 구현 가능하다.

 

간단하게 jmp로 가려면 main() 근처에 있어야 된다

실행 영역의 빈 곳을 찾아서 

 

lea rcx, ds:[0x00007FF6426CAC28]
call 0x00007FF6426C1195
jmp 0x00007FF6426C1872

 

printf("Hello World!")를 Loop하는 어셈블리를 간단히 짜주고 주소를 복사해 가자

jmp 0x00007FF6426C1872

 

main()에서 원래 있던 printf() 함수 부분 위에 아까 작성한 어셈블리

주소로 jmp 해주었다.