2014-04-19 10 views
1

나는 exploit-exercises.com "protostar"배포판에서 일해 왔습니다. 현재 stackack5에서 작동하는 이상한 오류가 발생하면서 현재 당황하고 있습니다.GDB에서 프로그램을 다른 값으로 종료시키는 데 영향을 줍니까?

셸 코드의 시작 부분에 '\ xcc'(SIGTRAP) opcode를 사용하고 GDB에서 테스트 했으므로 (이제는 제거 했음) 컨트롤을 내 셸 코드로 성공적으로 전송했음을 확인했습니다.

는 가능한 한 간단하게하기 위해, 내 쉘 코드의 목표는 내가 GDB에서 실행하면 1

의 상태로 종료 할 수있는 프로그램을 얻을 것입니다, 그것은 성공적으로 악용 트리거와와 종료 1의 코드. Yay!

... 내가 GDB를 종료하고 쉘에서 실행하려고 할 때

그러나 어떤 이유로

는, 그것은 나에게 (132)

의 코드를 가진 '잘못된 명령어'중단 및 종료를 제공합니다 내가 사용

쉘 코드는 다음과 같습니다 그들은 0x80으로 시스템 호출에 대한 적절한 값인지 확인하기 위해 시작 부분에 %의 EAX와 % EBX을 제로의 사소한 조정과 http://repo.shell-storm.org/shellcode/files/shellcode-470.php . 내 파일을 악용 만드는 데 사용하고

명령은 다음과 같습니다

perl -e 'print "A"x76 . "\x3a\xfd\xff\xbf" . "\x90"x20 . "\x33\xdb\x33\xc0\x40\x43\xcd\x80"' > stack5_exploit 

사람이 왜 다른 출력 초래 GDB 내에서 그것을 실행하는 등의 아이디어가 있습니까?

0x80 인터럽트가 처리되는 방식과 관련이있을 것이라고 생각하지만 Linux보다 Windows 내부에 대한 경험이 훨씬 큽니다.

답변

0

테스트에서 자세히 살펴 보지 않았지만 GDB는 기본적으로 주소 공간 임의 화를 비활성화합니다. 일반적으로 디버깅 중에 원하는대로하므로 가변 주소는 실행마다 고정되어 있습니다.

ASLR이 켜져있을 때 사용자의 익스플로잇이 작동하지 않는다고 생각합니다.

set disable-randomization off 명령을 사용하여 주소 랜덤 화를 사용하도록 GDB에 요청할 수 있습니다.

또한 장애인 ASLR과 GDB 외부 프로그램을 실행할 수 있습니다

setarch -R i386 stack5 < stack5_exploit 
+0

vm에 이미 aslr이 비활성화되어 있습니다. 그래도 setarch 팁을 주셔서 감사합니다! –

1

신경 끄시를, 내가 그것을 알아 냈어.

환경 변수는 gdb 실행시 프로그램의 정상 실행시와 다릅니다.

imgur 링크에서 눈에 띄는 차이점이 하나 있습니다. gdb에서 디버거 외부에서 전체 경로 (/ opt/protostar/bin/stack5)를 사용하여 프로그램을 호출하면 상대 경로를 사용하여 호출됩니다 ./stack5).

argv [0]은 호출 된 프로그램의 문자열을 보유하므로; 내 페이로드를 스택 위로 옮기고 '\ x90'썰매를 놓치게 만듭니다.

또한 gdb는 환경 변수 LINES와 COLUMNS를 설정합니다.이 변수는 디버깅하는 동안 '실제'주소를 얻기 위해 무효화 될 수 있습니다.

감사합니다. matthias!

Buffer overflow works in gdb but not without it