시작 전에!
gdb bomb 으로 bomb 실행 파일로 gdb를 실행하도록 한다.
이후 (gdb) 이렇게 터미널 창에서 입력할 수 있게 되면
제일 먼저!
(gdb) b phase_1
(gdb) b phase_2
(gdb) b phase_3
(gdb) b phase_4
(gdb) b phase_5
(gdb) b phase_6
(gdb) b explode_bomb
으로 explode_bomb이 실행되서 폭탄이 터지기 직전에 브레이크 포인트를 걸어준다.
만약 저게 실행 되었다면 k를 눌러서 프로그램을 종료 후 다시 시작하도록 한다. 시작은 (gdb) r 로 프로그램을 시작한다.
Breakpoint 16, 0x0000000000401509 in explode_bomb ()
(gdb) k
꼭이다!!!
이제 Phase 1 이다.
이제 실행을 해보자
(gdb) r
Starting program: /home/ubuntu/spg-2022-bomblab/1251056/bomb
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Welcome to my fiendish little bomb. You have 6 phases with
which to blow yourself up. Have a nice day!
122 <- 내가 입력한 것
이러면 아래처럼 된다.
Breakpoint 14, 0x0000000000400e8d in phase_1 ()
(gdb) disas
Dump of assembler code for function phase_1:
=> 0x0000000000400e8d <+0>: sub $0x8,%rsp
0x0000000000400e91 <+4>: mov $0x402490,%esi
0x0000000000400e96 <+9>: call 0x40140a <strings_not_equal>
0x0000000000400e9b <+14>: test %eax,%eax
0x0000000000400e9d <+16>: je 0x400ea4 <phase_1+23>
0x0000000000400e9f <+18>: call 0x401509 <explode_bomb>
0x0000000000400ea4 <+23>: add $0x8,%rsp
0x0000000000400ea8 <+27>: ret
End of assembler dump.
esi에 비교할 정답이 들어있으니
x/s $esi 하면
(gdb) x/s $esi
0x402490: "Why make trillions when we could make... billions?"
이제 저기 있는 따옴표 제외한 문자열이 정답이 되겠다.
Tips : 공부할 때
학생들이 gdb를 이용한 디버깅은 매우 생소하다. 그렇기에 익숙해질 필요가 있다. bomblab을 통해서 어셈블리를 공부할 때 참고하여 도움이 되도록 한다.
Compiler Explorer : 내가 작성한 코드의 어셈블리는 어떻게 작성되는지 확인할 수 있는 웹
이 사이트를 통해서 간단한 C 언어 프로그램을 넣어보자. 여기서는 각 C 언어 코드마다 어떤 어셈블리로 번역이 되는지 파랑, 빨강 색 영역을 통해서 볼 수 있다.
main 함수에 다른 함수를 실행할 때, 어떻게 함수 프롤로그와 에필로그가 적용되는지 익숙해질 수 있다.
어떻게 scanf의 값이 변수에 입력이 되는지 확인할 수 있다. 이를 통해 어떻게 라이브러리 함수가 불려지는지 확인할 수도 있다.
+,- 등의 사칙연산은 어떻게 되는지 확인할 수 있다.
물론 Bomblab에서는 AT&T 방식으로 어셈블리코드를 보는 걸로 알고 있다.(내가 배울 때는 그랬다.) AT&T와 intel 방식 두 가지로 나누는데 방식에 따라서 add 0x01, $eax 여기서 소스와 데스티네이션의 위치가 반대로 되어있다. intel은 데스티네이션이 앞에 있었나 그럴 것이다.
그렇기에 여기서 intel 옵션을 꺼야한다.
밤랩은 x86-64 아키텍쳐를 이용하니 gcc의 버전도 그렇게 바꾸면 된다.
그렇게 되면 직접 어셈블리가 어떻게 되는지 알 수 있다. (시스템 보안 쪽 생각이라면 어셈블리어 공부 많이 하자. 도움이 된다.)
GDB peda : gdb의 디스플레이 플러그인 (기본적인 스택, 레지스터, 코드 따로 명령어 치지 않고도 보여준다.)
https://github.com/longld/peda
gdb 그냥 이용하면 어렵다. 이를 이용해서 간단하게 레지스터가 어떻게 돌아가는지도 보고 색깔 강조 효과를 통해서 조금은 눈 아프지만 보이긴 보인다.
'[Computer Science] -보호글 > [시스템프로그래밍]' 카테고리의 다른 글
[시스템프로그래밍]9/7(목) (0) | 2023.09.07 |
---|