문제
▶ 소스파일 추가
vi test_gdb.c
▶ 컴파일
gcc -o test test_gdb.c
위와 같은 방법으로 컴파일을 하려고 했으나 몇몇 학우들의 과정을 봤는데 32비트로 컴파일을 해주었다.... (왜 32비트로 컴파일 해야되는지는 물어봐야겠다..)
64비트 우분투에서 32비트용 컴파일을 할때 뒤에 -m32을 써준다.
gcc test_gdb test_gdb.c -m32
▶리눅스 버전 확인
getconf LONG_BIT
arch
arch를 입력했을때 출력값이 x86_64면 64bit , i386 또는 i686이 나오면 32bit이다.
64bit에서 개발한 프로그램을 32bit에서 호환 가능하도록 패키지를 설치한다.
▶64비트 환경에서 32비트로 컴파일
sudo apt-get install gcc-multilib
위에 명령어를 입력해주니 설치가 진행됐고 다시 컴파일을 32비트로 입력했을때 성공했다.
▶ gdb로 들어오기
▶ main 함수 보기 위해 disas main을 입력해주었다.
main 함수 부분의 어셈블리 코드들이 보인다.
전역변수에 저장하는 데이터 세그먼트는 없는 상태이다.
eip는 앞으로의 수행할 시작점의 위치를 갖고 있다. main함수의 시작점이다.
eip가 갖고 있는 값은 main함수의 첫번째 0x08048460이다.
함수의 프롤로그 부분에 push ebp(base pointer) esp의 값을 4byte 뺀값을 ebp에 넣겠다는 값이다.
mov로 esp를 ebp로 복사하면 둘이 같은 지점을 가리킨다.
sub로 esp에서 4byte를 2번 빼서 8byte만큼 공간을 확장시켰다.
인자값을 주기 위해 공간을 확장한것이다. push로 3-2-1순으로 들어간다.
스택구조는 가장 나중에 들어간걸 가장 먼저 꺼내는 FIFO로 1-2-3이 아닌 3-2-1순으로 넣었다.
call로 인자값을 담은 것을 function에 넘긴다. 주소는 804383b이다.
잠깐 function함수로 빠져서 function함수를 실행하고 다시 돌아온다.
이때, 다시 어디로 돌아올지 eip에 함수의 시작부분인 0x0804843b이 들어있다.
▶ 처음 시작점이 어디인지 확인해보기 위한 과정
b * 0x08048460
맨 처음 시작하는거에 브레이크를 걸었다.
그다음에,
info reg eip
main함수에 맨첫번째 주소가 나오는것을 확인 할 수 있다.
▶ call 전에 브레이크를 걸고, ls로 쭉 내려가서,
sub로 28byte만큼 확장하고 있는 것을 볼수 있다.
buffer1이 15byte, buffer2가 10byte인데 , 여기서는 4byte 단위로 할당이 돼서 15byte는 4*4인 16byte가 할당되고 10byte는 4*3=12byte가 할당된다.
따라서 총 28byte가 할당이 된걸 확인할 수 있다.
function함수의 시작주소가 eip에 들어있는것을 확인 할 수 있다.
▶ 다시 function함수에 와서
초록색 부분은 오류 났는지 안났는지 확인한다.
leave ret을 에피로그다.
leave는 mov %ebp, %esp 와 pop %ebp가 묶여 있는 것이다.
▶ si로 쭉 내려와서 function을 나가고
더한다는 것은 반환한다는 의미이다. function값도 반환하고 할당하기 이전으로 돌아갔다는 것이 add이다..
▶ main에도 프롤로그, 에피로그 과정 있다.
main함수작업을 프롤로그이전으로 돌아가게 된다.
gdb가 어떻게 돌아가는 건지 과정을 살펴보았다.
'보안 > 포너블' 카테고리의 다른 글
포너블 Day6 basic_exploitation_001 풀기 (0) | 2021.05.19 |
---|---|
포너블 Day6 pwnable.kr bof (0) | 2021.05.19 |
포너블 Day5 GDB설치, 명령어 (0) | 2021.05.12 |
포너블 Day4 collision 문제풀이 (0) | 2021.05.05 |
포너블 Day3 리눅스 특수 권한 (0) | 2021.05.05 |