2010-12-08 3 views
-2

기계어에서 null (00)을 제거하는 방법을 알아야합니다. 나는 어셈블리 언어로 코드를 작성했다. 그것은 성공적으로 실행 중입니다. 내가 NULL없이 출력을 필요기계 코드에서 NULL (00)을 제거하는 방법?

.data 
    Bash: 
     .asciz "/bin/hostname" 
    Null1: 
     .int 0 
    AddrToBash: 
     .int 0 
    NULL2: 
     .int 0 

    .text 
     .globl _start 

_start: 
     #execute routine 

     xor %eax,%eax 
     movl $Bash, AddrToBash 
     movl $11,%eax 
     movl $Bash,%ebx 
     movl $AddrToBash,%ecx 
     movl $NULL2,%edx 
     int $0x80 

     #exit routine 


    Exit: 
     movl $10,%ebx 
     movl $1,%eax 
     int $0x80 

다음 출력이

4000b0: 31 c0     xor %eax,%eax 
    4000b2: c7 04 25 f2 00 60 00 movl $0x6000e0,0x6000f2 
    4000b9: e0 00 60 00 
    4000bd: b8 0b 00 00 00   mov $0xb,%eax 
    4000c2: bb e0 00 60 00   mov $0x6000e0,%ebx 
    4000c7: b9 f2 00 60 00   mov $0x6000f2,%ecx 
    4000cc: ba f6 00 60 00   mov $0x6000f6,%edx 
    4000d1: cd 80     int $0x80 

00000000004000d3 <Exit>: 
    4000d3: bb 0a 00 00 00   mov $0xa,%ebx 
    4000d8: b8 01 00 00 00   mov $0x1,%eax 
    4000dd: cd 80     int $0x80 

방법 00을 제거하는 것입니다, 가 나는 blahahahahahaha (BL)에 al, bxeax 같이 변경 ......하지만 않았다 작동하지 않습니다 누군가가 수정할 수 있습니다 .......

+0

게시글의 점수 하한치를 수정하십시오. –

+10

나는 왜 사람들이 마법 "형식 코드"버튼을 클릭하는 것이 그렇게 어려운지 결코 이해할 수 없을 것이다. 또는 사람들이 미리보기 *를 보지 않고 왜 코드의 절반이 잘못된 서식으로 인해 표시되지 않는지 알 수 있습니다 **. ** 자신의 ** 질문을 보는데 귀찮게 할 수 없다면, 왜 다른 사람이 그것을 읽으 리라고 기대합니까? – jalf

+1

"null이 아닌"무엇을 의미합니까? 어떤 널을 제거 하시겠습니까? * 왜 *? – jalf

답변

0

따라서 바이트 0을 포함하지 않는 opcode를 사용하려고합니다. 이는 문자열 오버 플로우를 생성하는 데 유용 할 수 있습니다 (예 : strcpy()).

어셈블리를 잘 배워서 가장 일반적인 명령의 이진 인코딩을 알고 있으므로 0을 피할 수 있습니다. 또는 기존 도구를 사용하여 원본 코드를 표현으로 인코딩하는 것 0 바이트 (예 : BCD, base64 또는 심지어 010010010과 같은 ASCII 문자열)없이 0을 포함하지 않는 특수 디 스크립트를 앞에 붙입니다.

+0

THanks for Reply ..... 어셈블리 언어로 execv 시스템 호출을 사용하여 호스트 이름을 인쇄해야합니다. 운영체제는 FreeBSD입니다. 컴파일하고 코드를 실행 한 후에 opcode를 생성 할 것입니다 ....하지만 opcode는 00 쌍을 포함해서는 안됩니다 .........하지만 어떻게 해야할지 잘 모릅니다 – Neefra

3

쉘 코드에서 NULL 바이트를 피하려면 많은 사항을 고려해야합니다. 그러나 대부분의 경우 동일한 명령어로 명령어를 대체해야합니다. 예를 들어

,

mov $0, %eax 

은 NULL 바이트를 포함 b8 00 00 00 00 생산하고 있습니다.

xor %eax, %eax 

으로 대체하는 것은 의미 상 동일하지만 대신 31 c0을 생성합니다.

셸 코드 작성에 대한 유용한 정보는 Smashing The Stack For Fun And Profit을 참조하십시오. 책 Hacking: The Art of Exploitation에는 쉘 코드에서 NULL 바이트를 피하는 것에 대한 절 (0x523)이 있습니다.

관련 문제