"프로그램이 실행되는 동안"이 문제의 한 부분이다. 다른 하나는 "효과를 분석"하기 위해 미리 중단 점을 설정할 수 있습니다.
GDB의 기본 동작은 동일한 표준 스트림을 사용하여 프로그램을 하위 프로세스로 실행하는 것입니다. 따라서 GDB의 CLI에있는 동안 자식의 표준 입력란에 글을 쓰는 것은 불가능합니다. 왜냐하면 현재로서는 프로그램이 아닌 GDB에서 읽을 수 있기 때문입니다.
가장 간단한 해결책은 tty 해결 방법 (tty
명령 + stty
설정 + /proc/<pid>/fd/{0,1}
에 읽기/쓰기)을 사용하는 것입니다. 코드를 테스트 할 수 있고 GDB에서 "호출 가능"하도록하는 것입니다. 그러면 문자열 인수를 함수에 전달하여 테스트하고 디버깅 할 수 있습니다. 예를 들어
:
#include <stdio.h>
#include <unistd.h>
void exploitme(char* str)
{
printf(str);
}
int main()
{
while (1)
{
char str[10];
fgets(str, sizeof (str), stdin);
exploitme(str);
}
return 0;
}
exploitme()
은 그것을 사용하는 모든 것이 제대로 초기화되면 호출하는 것이 가능 있도록 제대로 단일 진입 점에 싸여 이용할 경우입니다. 그런 다음 명령을 사용하여 main()
중단 점에 도달하면 (즉, 주 호출자에서 수행되는 C 런타임이 완료 될 때까지) 호출 할 수 있습니다. 당신은 C 문자열 평가를 포함 GDB의 인수 수혜
~/test $ gdb ./a.out
(gdb) call exploitme("hello")
You can't do that without a process to debug.
(gdb) b main
Breakpoint 1 at 0x4005ae: file helloworld.c, line 14.
(gdb) r
Starting program: /home/julio/test/a.out
Breakpoint 1, main() at helloworld.c:14
14 fgets(str, sizeof (str), stdin);
(gdb) call exploitme("hello")
(gdb) call exploitme("hello\n")
hellohello
(gdb) call exploitme("AAAAAAAA\x08\x04\88\72\n")
AAAAAAA�:
(gdb) b exploitme
Breakpoint 2 at 0x400592: file helloworld.c, line 6.
(gdb) call exploitme("foo")
Breakpoint 2, exploitme (str=0x602010 "foo") at helloworld.c:6
6 printf(str);
The program being debugged stopped while in a function called from GDB.
Evaluation of the expression containing the function
(exploitme) will be abandoned.
When the function is done executing, GDB will silently stop.
참고.
다른 (길게 & complexer) 솔루션은 다른 tty 아래에서 프로그램을 실행하여 독립적으로 GDB와 프로그램을 작성할 수 있도록 해줍니다.
참고로 파이썬이 필요 없으므로'bash'를 사용할 수 있습니다 :'echo $ 'AAAAAAAA \ x08 \ x04 \ 88 \ 72'| ./program' – Barmar
이 방법이 도움이됩니까? http://stackoverflow.com/q/8422259/72178? – ks1322
예. 이것은 매우 도움이됩니다! 그러나 프로그램이 이미 실행 중일 때 임의의 바이트를 입력 할 수있는 방법이 있습니까? –