GDB를 통해 쉘 실행하기

승대·2023년 9월 12일
0

시스템프로그래밍

목록 보기
1/2
post-thumbnail

다음과 같은 good_job.c 파일이 있다.

gdb로 good_job.c 파일을 debug해 no way가 아닌 Good job~!을 출력하는 방법들을 알아보고 그것을 통해 gdb에서 쉘을 시켜보려고 한다.

gcc 실행하기

아래와 같은 명령어로 gcc와 gdb를 실행히시켜 준다

$ gcc 파일명 -o debug -g

$ gdb -q ./debug


gdb를 통해 Good job~ 출력하기 1

첫 번째 방법은 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~이 실행된 것을 확인할 수 있다.


gdb를 통해 Good job~ 출력하기 2

첫 번째 방법에서 호출하는 함수를 바꿨다면 두 번째 방법으로는 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~을 출력할 수 있다.


gdb를 통해 Good job~ 출력하기 3

마지막으로 should_call 함수의 printf 에서 str 값을 변경해 Good job~!을 출력해 보겠다.

should_call 함수에 breakpoints를 걸어준다

그런 뒤에 set을 통해서 str의 값을 바꿔주면 Good job~!!!!이 출력되는 것을 확인할 수 있다.


gdb를 통해 쉘 호출하기

쉘을 호출하기 위해서는 system 함수를 사용해야한다. goob_job.c 코드 내에서 gdb를 이용해 system(”/bin/sh”)를 호출해야 gdb에서 쉘을 호출 할 수 있다.

쉘을 호출하기 전 프로세스 목록이다. system 함수를 호출하기 위해서는 앞서의 1번과 2번을 둘다 활용하여 쉘을 호출 할 수 있다.

위에서 했던 것 처럼 어셈블리어 코드를 확인해주고

main+41 에 breakpoints를 걸어준다
func에 들어간 값을 확인해 주고, 호출할 함수를 system 함수로 바꿔준다.

함수에서 호출할 값을 확인해주고 “/bin/sh”로 바꿔준다.

그리고 나서 실행을 해주면 쉘에 들어갔음을 확인할 수 있고 프로세스 목록도 확인할 수 있다.

profile
힘 내야지 뭐 어쩌겠어

2개의 댓글

comment-user-thumbnail
2023년 10월 10일

안녕하세요^^

1개의 답글