다음과 같은 good_job.c 파일이 있다.
gdb로 good_job.c 파일을 debug해 no way가 아닌 Good job~!을 출력하는 방법들을 알아보고 그것을 통해 gdb에서 쉘을 시켜보려고 한다.
아래와 같은 명령어로 gcc와 gdb를 실행히시켜 준다
$ gcc 파일명 -o debug -g
$ gdb -q ./debug
첫 번째 방법은 func의 값을 바꿔 호출하는 함수를 바꾸는 것이다.
func=shuld_call 이 있는 17번 째 줄과 func(”no way\n”)가 있는 18번 째 줄에 breakpoints를 걸어준다.
r 명령어와 c 명령어를 통해 func에 들어가 있는 함숫값을 바꿔주기 위해 func=should_call이 호출된 다음줄인 18번째 줄에 서 멈춰준다.
set 명령어를 통해 func의 값을 변경해준다.
그러고 나서 실행하면 func의 값이 should_call에서 dont_call 함수로 바뀌어 Good job~이 실행된 것을 확인할 수 있다.
첫 번째 방법에서 호출하는 함수를 바꿨다면 두 번째 방법으로는 should_call 함수를 출력하지만 전달되는 매개변수 값을 바꿔 Good job~!을 출력해보겠다.
gcc를 실행해주고 main 함수와 func에 값이 들어간 후인 18번 째 줄에 breakpoints를 걸어준다
아래의 명령어를 실행하여 main 함수의 어셈코드를 확인한다.
$ disas main
func=should_call 부분을 찾아야 하는데 어셈블리어에서는 +41 번째의 mov 명령어가 rid값을 rdx로 넣는 것이니 b *main+41 명령어를 통해서 breakpoints를 다시 설정해준다.
그런다음 어셈블리어 코드를 다시 확인해주고 good_job.c의 18번 쨰 줄 즉 should_call 함수를 호출해 줄때 함수에 전달되는 매개 변수 값을 바꾸어 Good Job~!을 출력할 수 있다.
레지스터 rax에는 should_call 함수가 들어있는 것을 볼 수 있고, rdx는 “no way\n”값이 들어있는 것을 볼 수 있다. “no way\n”값을 “Good Job~!!!\n”으로 바꾼다면 should_call을 출력해도 Good job~을 출력할 수 있다.
마지막으로 should_call 함수의 printf 에서 str 값을 변경해 Good job~!을 출력해 보겠다.
should_call 함수에 breakpoints를 걸어준다
그런 뒤에 set을 통해서 str의 값을 바꿔주면 Good job~!!!!이 출력되는 것을 확인할 수 있다.
쉘을 호출하기 위해서는 system 함수를 사용해야한다. goob_job.c 코드 내에서 gdb를 이용해 system(”/bin/sh”)를 호출해야 gdb에서 쉘을 호출 할 수 있다.
쉘을 호출하기 전 프로세스 목록이다. system 함수를 호출하기 위해서는 앞서의 1번과 2번을 둘다 활용하여 쉘을 호출 할 수 있다.
위에서 했던 것 처럼 어셈블리어 코드를 확인해주고
main+41 에 breakpoints를 걸어준다
func에 들어간 값을 확인해 주고, 호출할 함수를 system 함수로 바꿔준다.
함수에서 호출할 값을 확인해주고 “/bin/sh”로 바꿔준다.
그리고 나서 실행을 해주면 쉘에 들어갔음을 확인할 수 있고 프로세스 목록도 확인할 수 있다.
안녕하세요^^