[리버싱] 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! 라고 나온다.
이 부분을 대충 수정해 보자.
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 으로 표현됨)
그럼 좀 더 긴 주소를 넣어보자.
lea rcx, ds:[0x00007FF6426CAC28] => lea rcx, ds:[0x00007FF6426CAD20]
이런 식으로 긴 문자열이 나오게 된다.
3. 코드 케이브(Code Cave)로 문자열 만들기
이런 빈 곳을 찾아서 문자열을 입력해 보자.
lea rcx, ds:[0x00007FF6426CAC28] => lea rcx, ds:[0x00007FF6426CA868]
0x00007FF6426CA868 를 덮으면
이렇게도 수정 가능하다.
4. 코드 케이브(Code Cave)로 어셈블리 만들어보기
이 방법을 이용해서 어셈블리도 구현 가능하다.
실행 영역의 빈 곳을 찾아서
lea rcx, ds:[0x00007FF6426CAC28]
call 0x00007FF6426C1195
jmp 0x00007FF6426C1872
printf("Hello World!")를 Loop하는 어셈블리를 간단히 짜주고 주소를 복사해 가자
jmp 0x00007FF6426C1872
main()에서 원래 있던 printf() 함수 부분 위에 아까 작성한 어셈블리
주소로 jmp 해주었다.

끝
'Reversing' 카테고리의 다른 글
[리버싱] reversing.kr의 [Easy Crack] 풀어보기 (0) | 2025.10.02 |
---|---|
[리버싱] x64dbg로 Hello World! 리버싱 해보기 (0) | 2025.09.26 |