# GDB server
- nghe tên thì có thể đại khái hiểu là gỡ rối từ xa
- tức là ta có thể DEBUG 1 chương trình từ máy đích (target) ngay trên máy chủ (host)
>GDB Server là một ứng dụng độc lập giữa GDB và thiết bị đích. Nó cho phép GDB kết nối đến thiết bị đích thông qua một kết nối mạng hoặc cổng nối tiếp và cho phép GDB gỡ rối chương trình đang chạy trên thiết bị đích.
>GDB Server là một ứng dụng chạy trên thiết bị đích và lắng nghe các yêu cầu từ GDB thông qua giao thức GDB Remote Serial Protocol. Khi GDB kết nối đến GDB Server, GDB Server sẽ giữ kết nối và chờ đợi các yêu cầu từ GDB. Khi GDB gửi một yêu cầu, GDB Server sẽ xử lý yêu cầu và trả về kết quả cho GDB.
- Tiếp theo, ta cần kết nối từ máy chủ (B) đến máy đích (A) bằng giao thức SSH. Điều này cho phép ta truy cập từ xa vào máy đích (A)
- Khi sử dụng gdbserver, không nhất thiết phải sử dụng kết nối SSH, tuy nhiên tùy thuộc vào cách thức triển khai và môi trường mà ta đang làm việc, kết nối SSH có thể được sử dụng để kết nối đến máy đích nhúng hoặc máy chủ (client).
## máy đích (target system) (A)
```bash
$ sudo apt-get update
$ sudo apt-get install gdb gdbserver
```
- ta cần tệp để thực thi “gdbserver” trên máy đích
- mặc định khi khởi động gdbserver, chương trình sẽ tự động tạm dừng việc thực thi(bắt đầu gỡ rối) và sẽ "lắng nghe" cái tín hiệu kết nối với target từ host
```bash
$ gdbserver localhost:2004 vuln
Process program created; pid = 2023
Listening on port 2004
```
- Ở đây, port là cổng mà GDB Server sẽ lắng nghe các yêu cầu từ GDB, và **vuln** là tên file thực thi mà chúng ta muốn gỡ rối trên máy đích.
- Lệnh trên tạm dừng thực thi trên vuln và đợi trình gỡ lỗi kết nối với nó trên cổng 2004
- ngoài ra ta cần cung cấp địa chỉ IP (**host** : port) từ máy đích
- ta có thể xem IP bằng câu lệnh
```bash
$ ifconfig
```
## máy chủ (host system) (B)
- tệp thực thi ở máy chủ phải hoàn toàn giống với tệp thực thi trên máy đích để đảm bảo tính tương thích và độ chính xác khi gỡ lỗi
```bash
$ gdb vuln
(gef) target remote 123.456.7.890:2004
```
- trong đó *123.456.7.890* là địa chỉ IP của máy đích (A)
- ta hoàn toàn có thể gỡ rối bằng các lệnh như:
```
c
b*<addr>
r
tel
ni
si
kil
q
...
```
## Demo Example
- giả sử ta có file source C như sau
```c
#include <stdio.h>
int power(int,int);
int main() {
int i;
printf("Program to calculate power\n");
for (i=0;i<10;i++)
printf("%d %d\n",i, power(2,i));
return 0;
}
int power (int base, int n) {
int i,p;
p=1;
for (i=1; i<=n; i++)
p = p*base;
return p;
}
```
- ta sẽ compile nó bằng cú pháp
```bash
$ gcc test.c -o vuln
```
- trên máy đích
```bash
$ gdbserver localhost:2004 vuln
Process my_prg created; pid = 20624
Listening on port 2004
```
- trên máy chủ
```bash
$ gdb vuln
(gef) target remote 123.456.7.890:2004
Remote debugging using 123.456.7.890:2004
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007ffff7dddaf0 in ?? () from /lib64/ld-linux-x86-64.so.2
(gef) b*main
Breakpoint 1 at 0x400550
(gef) c
Continuing.
Breakpoint 1, 0x0000000000400550 in main ()
```
- vì ở máy chủ ta đã đặt breakpoint, nếu ta tiếp tục (continue) trên máy chủ thì đầu ra ở máy đích là:
```bash
Remote debugging from host 123.456.7.890
Program to calculate power
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
Child exited with status 0
GDBserver exiting
```
## DEBUG động
- ta sẽ tìm \<pid> của tiến trình ta đang gỡ rối
- và trên máy chủ:
```bash
(gef) at 3850
```
## reference
[SimpleKeygen CTF HCMUTE](https://www.youtube.com/watch?v=C7WEmxNMqEM&pp=ygUYaMaw4bubbmcgZOG6q24gZ2Ric2VydmVy)
### example
#### gdbserver trên cùng 1 máy
- tìm IP

- máy đích (root-hlaan)

- máy chủ (user-baocao)

- máy (A)

- máy (B)

- kết quả ở máy (A)

- kết quả ở máy (B)

#### gdbserver trên 2 máy biệt lập có kết nối ssh
[link demo](https://www.youtube.com/watch?v=kONFFecp3R8&t=474s)