2014-02-19 7 views
0

일부 쉘 코드가있는 쉘을 생성하려고합니다. 페이로드는 프로그램 자체에 있지만, 프로그램을 개별적으로 실행하면 세그먼트 오류가 발생하지만 gdb에서 실행하면 쉘이 열립니다. 누군가가 문제의 원인을 지적 할 수 있습니까?gdb에서 실행되지만 gdb에서 실행되지 않습니다.

[email protected]:~/folder$ ./a.out h h 
Segmentation fault (core dumped) 

[email protected]:~/folder$ gdb -q a.out 
Reading symbols from /home/folder/a.out...done. 
(gdb) run h h 
Starting program: /home/folder/a.out h h 
process 22119 is executing new program: /bin/dash 
$ 
$ 
+0

나는 한번 같은 Heisenbug했다. 힙 손상으로 인해 정의되지 않은 동작입니다. 재현이 가능하다는 사실에 감사드립니다. 코드를 [minimal complete example] (http://www.sscce.org)로 좁히고 게시하여 버그를 발견하도록하겠습니다. – Beta

답변

3

당신이 얻을 core을 할 수 있기 때문에 문제가,

첫째가 무엇인지, 당신은 충돌을 이해하는 데에서 볼 수 있었다.

둘째, GDB 외부에서 a.out을 실행하면 전체 ASLR이 발생할 가능성이있는 반면, GDB는 기본적으로 주소 무작위 화 (ASLR)를 비활성화합니다 (디버그하기 쉽도록하기 때문에 모든 것이 한 곳에 저장됩니다). a.out (GDB 포함)

sudo -c "echo 0 > /proc/sys/kernel/randomize_va_space" 

을 또는 당신은 GDB 내에서 랜덤을 활성화 할 수 있습니다 :

당신은 세계적으로 ASLR을 해제 할 수 있습니다

(gdb) set disable-randomization off