전체 글 94

문자열 길이 계산 프로그램

개요어셈블리를 활용해서 다음과 같이 문자열 인풋을 받고, 그 길이를 계산하는 프로그램을 만든다.Xdbg로 기존 exe 파일을 수정해서 만든다. 상세.data 영역: 메모리를 패치한다..text 영역: 코드를 작성한다.코드코드는 다음과 같다.push 0x403030 ;"Enter string: "call 0x402614 ;printfpop ebxpush 0x403060 ;string addrpush 0x403054 ;"%s"call 0x402604 ;scanfpop ebxcall 0x4025F4 ;strlenpop ebxpush eax ;strlen returnpush 0x403060 ;string addrpush 0x403040 ;"%s has %d letters!\n"c..

정수 printf, scanf 예제

개요Xdbg로 기존에 있는 exe 파일을 수정해서 아래 C 코드에 해당하는 동작을 하도록 한다.이때 기존 main 함수 위치에는 공간이 부족하므로 code cave를 사용해야 한다.#include int main(){ int a,b; printf("Enter first number: "); scanf("%d", &a); printf("Enter second number: "); scanf("%d", &b); printf("%d + %d = %d\n", a, b, a+b); return 0;} 코드는 다음처럼 정수 두 개를 입력하면 그 합을 출력하는 코드다. 상세(1) 아래와 같이 .data 영역을 패치한다. (2) main 함수 영역에 다음처럼 입력한다. (3) co..

문자열 printf, scanf 예제

개요Xdbg로 기존에 있는 exe 파일을 수정해서 아래 C 코드에 해당하는 동작을 하도록 한다.이때 기존 main 함수 위치에는 공간이 부족하므로 code cave를 사용해야 한다.#include int main(void){ printf("Enter first name: "); char fn[30]; char ln[30]; scanf("%s", fn); printf("Enter last name: "); scanf("%s", ln); printf("Hello, %s %s!\n", fn, ln); return 0;} 코드는 다음처럼 성, 이름을 입력하면 Hello, {성} {이름} 을 출력하는 코드다. 상세(1) 아래와 같이 .data 영역을 패치한다. (2) m..

PE 파일의 Code Cave

정의Code cave는 PE 파일의 .text 섹션에서 안 쓰는 영역으로, 여기에 코드를 주입할 수 있다. 찾는 법(1) PE bear에서 파일을 연다.Section Headers 탭에서 .data 영역이 시작되는 주소를 찾는다. (2) HxD에서 파일을 연다.해당 주소 위로 빈 공간 영역의 크기를 확인한다. 이가 .text 영역에 있는 code cave의 크기다.예시에서는 256 바이트로 보인다. (3) xdbg에서 파일을 연다..text 영역 최하단에 기계어 0000이 표시되기 시작하는 부분을 찾는다.여기서부터 256 바이트를 code cave로 활용할 수 있다. 주의할 점(1) Xdbg에서는 code cave 공간이 더 큰 것처럼 표시될 수 있지만, 이는 가상 메모리 때문으로 실제 활용 가능한 공..

인자가 다수인 함수의 활용

개요어셈블리에서 인자가 다수인 함수 사용 시 기본 구문은 다음과 같다.push [n번째 인자]push [n-1번째 인자]...push [첫번째 인자]call [함수] 이를 활용하여 다음 C 프로그램을 어셈블리로 작성해 볼 것이다.printf("hello, %d\n", 12);환경활용 프로그램: x32dbg.data 영역: 0x403030~printf 주소: 0x402614예시1정수 인자값을 바로 PUSH하는 예시다. 먼저 'hello %d\n'을 메모리에 로딩한다. 리틀 엔디언을 고려하여 역순으로 입력한다.mov dword ptr ds:[0x403030], 0x6c6c6568 // llehmov dword ptr ds:[0x403034], 0x25202c6f // o ,%mov dwor..

인자가 다수인 함수

개요어셈블리에서 인자가 다수인 함수 사용 시 기본 구문은 다음과 같다.push [n번째 인자]push [n-1번째 인자]...push [첫번째 인자]call [함수] 이를 활용하여 다음 C 프로그램을 어셈블리로 작성해 볼 것이다.printf("hello, %s\n", "assembly"); 활용 프로그램: x32dbg상세1. 메모리에 필요한 문자열을 적재한다. 어셈블리에서는 쌍따옴표가 필요없다. 2. 점프 테이블에서 printf 함수의 주소를 복사한다. 3. 코드를 작성한다.push 0x403040 // assemblypush 0x403030 // hello %s\ncall 0x402614 // printf 4. 실행 결과를 확인한다.주의 사항메모리 주소에서 Edit을 통해서 \n을 입력..

어셈블리로 문자열 출력하기

개요어셈블리의 함수 실행 기본 구문은 다음과 같다.push [인자값]call [함수] 이를 활용하여 hello world 문자열을 출력해 본다. 활용 프로그램: x32dbg1. 메모리에 문자열 로딩1-1. 'Memory map > .data > Follow in dump'를 클릭한다. 1-2. 기본 화면에 .data 영역이 표시된 것을 확인한다. 1-3. 빈 데이터 영역을 클릭한 후 Ctrl+e를 눌러 Edit 창을 연다. 1-4. UTF-8 칸에 원하는 문자열을 입력한다. 1-5. 메모리에 문자열이 올라간 것을 확인한다.2. printf 함수 찾기2-1. 스크롤을 내려서 함수 call을 찾는다. 어떤 함수인지는 상관 없다. 이를 더블클릭한다. 2-2. 점프 테이블 화면으로 넘어와지면, 메모리에 적재된 ..

어셈블리의 PUSH 명령어

개요PUSH와 POP을 통해 스택에 값을 입력한다. 요약PUSH 대상Syntax결과32bit 레지스터push eaxesp+=4*esp=eax16bit 레지스터push axesp+=2*esp=ax숫자push 0x12esp+=4*esp=0x12메모리 주소push 0x403030esp+=4*esp=0x403030예시32bit 레지스터-코드mov eax, 0xaamov ebx, 0xbbmov ecx, 0xccpush eaxpush ebxpush ecx -실행결과16bit 레지스터-코드mov eax, 0xaamov ebx, 0xbbmov ecx, 0xccpush axpush bxpush cx -실행결과숫자-코드push 0x12push 0x123456 -실행결과