완료됨
gdb -p로 실행 시 프로그램이 멈추지 않습니다.

파이썬 pwn으로 작성한 exploit 코드를 실행하고 그것을 gdb -p 분석하려고 하면 멈추지 않고 그대로 진행되버립니다.

파이썬 코드 내에서 pause()로 멈췄고 실제 실행 결과도 멈춰있는 상태인데도 불구하고 gdb -p로 해당 프로세스를 디버깅하려고 하면
그대로 실행되버립니다. (gdb 내에서 실행되고 파이썬은 그대로 멈춰있음)

분명 시작하자마자 pause()를 걸어놨음에도

하단과 같이 혼자서 read 함수가 있는 곳까지 실행해버립니다...;;

Legend: code, data, rodata, value
0x00007feec218fe8e in __GI___libc_read (fd=0x0, buf=0x7ffc625c51b0, nbytes=0x100)
at ../sysdeps/unix/sysv/linux/read.c:26
26 ../sysdeps/unix/sysv/linux/read.c: No such file or directory.

작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
juno2
답변 등록: 25

덧글과 질문을 보아하니.. pwntools의 pause 기능에 대해서 잘못 이해하고 계신 것 같습니다.

pwntools의 pause는 해당 프로그램을 일시 정지한다는게 아니라, 해당 파이썬 스크립트를 일시정지 한다는 것입니다.

그래서, read가 키보드 입력을 받을 기다릴 때 까지 계속해서 실행됩니다. (인터럽트)

스크립트를 통해 recvuntil를 사용하면 값을 받아올 때 까지만 프로그램이 실행되는게 아니라, 이미 프로그램 실행은 read가 키보드 입력을 기다리는 곳 까지 실행되었는데 버퍼 stream만 파이썬에서 제한하는 것이라고 생각해주시면 됩니다.

예시를 들어 설명해보면, 아래와 같은 프로그램이 존재한다고 했을 때

puts("a");
puts("b");
read(0, buf, 256);

이미 (A)지점에서는 "b\n"까지 전송 받았고, 프로그램은 read에서 키보드 입력을 받을 때 까지 기다리고 있습니다.

r.recvuntil("a\n") # (A)
pause()

그래서, pause가 실행되고 gdb -p를 하면 read에 멈춰있는 것입니다~~

read말고 sleep(100)을 해두고 attach를 하면 sleep에서 멈춰있을 것입니다~~

2021.09.10. 15:53