딩굴댕굴

Reverse Engineering - 02. BOF shellcode [작업중]

by jennysgap

BOX

gdb 사용법 및 code 추출


1. 간단한 프로그램 구성을 이용한 gdb 사용법 및 assembly 코드 확인
• comfile 시 "-static" 옵션을 사용하여 컴파일
# gcc -o program program.c -static

• main.c 프로그램 분석

1. 0x8048198    : 메모리의 주소부분

2. <main>          : main 함수로 부터의 거리

3. push  %ebp   : 어셈블리 표현식

    push  %ebp   : stack frame의 base point (bp) 값을 밀어 넣는다. (저장한다)

    move %esp %ebp   : stack point (sp) 를 bp에 저장한다.

    위의 연산은 새로운 함수가 호출될 때 마다 실행된다. 이를 prelude라 한다.


• main2.c 프로그램 분석

    sub  $0x4, %esp   : 변수가 들어갈 스택 공간의 확보 부분.

    소스코드에서 "int i;" int는 4바이트 크기이므로 확보할 때 "$0x4"로 표시


• main3.c 프로그램 분석

   movl  $0x3, 0xfffffffc (%ebp)   : $0x3은 i에 대입되는 3값이고, 

   선언되는 위치는 최상위로 부터 0xfffffff - 4 = 0xfffffffc 번지에 넣음


• main4.c 프로그램 분석

    movl  $0x61, 0xffffffff (%ebp)   : $0x61은 i에 대입되는 'a'값이고, 

    선언되는 위치는 최상위로 부터 0xffffffff 번지에 넣음


• test2.c 프로그램 분석

   mov  0xfffffffc (%ebp), %eax   : ebp - 4 주소 값을 eax 레지스터에 저장

    push %eax                                : 스택에 eat 집어 넣음

    push $0x8071528                    : 0x8071528 번지에 값 정보를 저장한다.

    * 해당 정보를 보기 위해 번지를 찍어보면 아래와 같은 결과를 출력 받을 수 있다.


    printf  함수에서 지정했던 스트링이 저장되어 있다.

    call  0x804864c <printf>  : printf 함수를 호출한다.

    add $0x8, %esp  : 할당에 사용되었던 스택의 블럭을 클리어 하기 위해 8복원한다.

    상기 내용을 토대로 기계어 제작이 가능하다.


• test3.c 프로그램 분석

# gcc -o test3.s test3.c -S        (-S : Assembly 형태로 제작, Symbolic code)

   기계어로 쉘 코드를 제작해 보았다.

   * 시스템 콜을 이용한 기계어 제작





반응형

블로그의 정보

jennysgap

jennysgap

활동하기