2011-11-20 2 views
5

주어진 취약한 코드에 대해 버퍼 오버플로 공격을 시도하고 있습니다. 하지만 내 악의적 인 문자열이 스택을 손상시키지는 않지만 악용 문자열에 포함 된 어셈블리 코드를 전혀 사용할 수 없기 때문에 잘못되었다고 생각됩니다.함수에 선택된 프레임의 프로그램 카운터가 포함되어 있지 않습니다.

여기 공격하려는 프로그램의 'ret'명령을 실행하기 전의 메모리 값입니다. 이 스택을 팝업과 팝 값 %의 EIP 지점을 만들 수 없기 때문에이 시점에서

0x55683984:  0x5568398c 0x...(old r.a)  0x68e322a1  0x0000c31c 
0x55683994:  0xf7fa9400  0x0804a3d7  0x556839c0  0xf7e518d0 

는 상황이 잘못? 그래서 내 익스플로잇 어셈블리 코드가 작동하지 않습니다. (0x68e322a1 0x0000c31c) Gdb는 No function에 선택된 프레임에 대한 프로그램 카운터가 들어 있다고 말합니다. 디버깅하지 않고 실행하려고하면 세그먼트 화 오류가 발생합니다.

이 문제는 내 어셈블리의 길이와 관련이 있습니까? (이 경우 6입니다)?

Program received signal SIGSEGV, Segmentation fault. 
0x5568398c in ??() 
(gdb) x 0x5568398c 
0x5568398c: 0x68e322a1 

세그 폴트를 일으키는 주소 안에 무엇이 있는지 볼 때 어떻게됩니까?

+0

당신은'disassemble'을 사용할 수 있습니다 호출 스택. 실행하려고하는 코드를 보여 주면 도움이 될 것입니다 (68 e3 인 경우에는 0 바이트가 포함되어있는 것처럼 보입니다). BTW, 이것이 숙제를위한 것이라면 그렇게 표시해야합니다. – user786653

+0

레이아웃을 사용하여 어떤 일이 일어나고 있는지 알 수 없었습니다. 게다가, 익스플로잇 코드가 c3 (ret 명령을 의미 함)으로 끝났으므로 길잃은 0 바이트는 문제가되지 않습니다. 중요한 점은 실수로 아마 정의되지 않은 메모리 주소에 도달하려고하는 것입니다. – bfaskiplar

답변

3

좋아, 여기에 '$'를 내 어셈블리 코드에서 movl 명령의 주소 앞에 놓는 것을 잊어 버리는 이야기가 있습니다. 따라서 프로그램은 세분화 오류를 일으키는 정의되지 않은 메모리 주소에 액세스하려고했습니다.

하지만, 내가 GDB는 말함으로써이 상황을 통지하는 방식이 마음에 들지는 disassemble 인쇄 현재 함수의 코드를 밖으로 기본적으로

+0

고마워, 내 베이컨을 구했어. – JustGage

5

'기능 없음 선택된 프레임의 프로그램 카운터를 포함하지'. 귀하의 경우 프로그램 카운터는 어딘가에 스택을 가리키고 gdb는 현재 기능의 경계가 어디인지를 이해하지 못합니다. 그래서 오류 메시지입니다.

하지만 당신은 수동으로 주소의 범위를 분해 지정할 수 있습니다 또는`X/10I $ eip` 그것은시키고 말았다와 코드를 볼 수있는`bt`이를 볼 수

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff 
+1

아주 좋은 속임수. 또는 $ rip, $ rip + offset을 디스 어셈블하여 스택 프레임의 위치를 ​​알아내는 데 어려움을 덜 수 있습니다. – Eric

관련 문제