[메모리 익스플로잇] 3. hexdump, objdump strace, ltrace -4주차

박승욱·2025년 11월 20일

메모리익스플로잇

목록 보기
5/6
post-thumbnail

이 강의에서는 3가지 도구(hexdump, objdump, strace/ltrace)에 대해서 배운다.

license_1.c 실습파일

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
        if (argc ==2) {
                printf("Checking license : %s\n", argv[1]);
                if(strcmp(argv[1], "AAA-Z10N-42-OK")==0) {
                        printf("Access Granted!");
                }else {
                        printf("Wrong!\n");
                }
        }else {
                printf("Usage: <key>\n");
        }
        return 0;
}

아주 간단한 C언어로 작성된 파일이다.
해당 파일을 컴파일하고 인자값(aaa)을 함께 줘서 실행하면 "Wrong"이 나온다. if-else문으로 문자열을 비교하고 일치하는 경움나 Access Granted 라는 구문이 출력이 되는 단순한 로직이다.

어셈블리어

jne(not if) 0x75 / je(if) 0x74
-> 어셈블리어로 된 파일을 수정하면 실행흐름을 바꿔서 특정한 입력이 아니더라도 access granted! 를 실행할 수 있다

"objdump -D -M intel license_1 | less" 를 입력하면 아래와 같은, 어셈블리어로 된 결과가 나온다.

/main을 입력하면 main함수 부분(원하는 특정 영역)을 찾을 수 있다.

main 함수를 따라 내려가다보면 '<strcomp'>를 볼 수 있다. 이 다음 나오는 jne 부분이 바로 문자열이 일치하지 않는 경우를 처리하는 구문이다.

vim으로 해당 파일을 열고 수정해보자. "vi -b ./license_1"을 입력하여 파일을 열면 바이너리 형태로 아래와 같이 나온다. 외계어처럼 보여서 뭔가 잘못 된 것 같지만, 정상적으로 실행이 된 거다.

vim안에서 명령모드로 "%!xxd"를 입력하면 아래와 같이 16진수 형태로 나온다. 한결 마음이 편해졌다ㅎㅎ 이제 앞서 objdump로 보았던 부분을 찾아서 수정해야 한다.

"11a0"을 검색하면 11aF부분에 0x75(jne)가 보인다. 0x74(je)로 바꾼다.

이때 주의할 것은 저장하는 것이다. "%!xxd -r" 이라는 명령을 입력하지 않고 나오면, ELF 파일 헤더가 망가져서 저장 후 objdump 실행이 먹통되는 경우가 있다. (나도 먹통이 되서 license_1을 license_11로 컴파일하고 다시 해야 했다ㅠ) 좋은 시행착오!

이제 다시 실행파일로 인자값을 넣어보자, access granted가 나오면 성공이다

profile
일취월장?

0개의 댓글