Red Hat과 Ubuntu 컴파일 및 어셈블리 문제(도서 참조)

Red Hat과 Ubuntu 컴파일 및 어셈블리 문제(도서 참조)

Shellcoder 매뉴얼에 언급된 ELF 파일을 실행하는 데 종종 문제가 발생하므로 Shellcoder 매뉴얼에 언급된 운영 체제를 추천해 주실 수 있습니까(아래 오류 참조). 이러한 오류를 극복하려면 명령이나 매개변수를 입력해야 한다는 것을 알고 있지만 그렇게 했지만 여전히 어셈블리 수준에서 책에 나온 것과 동일한 출력을 얻지 못합니다.

시연할 파일을 실행 중입니다.우분투 4.15.0-106-일반(내가 사용하는 테스트 환경)과 어셈블리 수준의 많은 것들이 다릅니다.

아래의 차이점은 내 문제를 이해하는 데 도움이 될 것입니다. 아래 코드는 이 책의 주요 내용을 발췌한 것입니다 int 0x80 instruction.

암호:

main()
{
    exit(0);
}

이 책의 o/p는 다음과 같습니다.

[slap@0day root] gdb exit
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions. Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for
details.
This GDB was configured as “i386-redhat-linux-gnu”...
(gdb) disas _exit
Dump of assembler code for function _exit:
0x0804d9bc <_exit+0>: mov 0x4(%esp,1),%ebx
0x0804d9c0 <_exit+4>: mov $0xfc,%eax
0x0804d9c5 <_exit+9>: int $0x80
0x0804d9c7 <_exit+11>: mov $0x1,%eax
0x0804d9cc <_exit+16>: int $0x80
0x0804d9ce <_exit+18>: hlt
0x0804d9cf <_exit+19>: nop
End of assembler dump.

내 테스트 환경(ubuntu 4.15.0-106-generic 16.04.1)의 o/p는 다음과 같습니다.:

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5)7.11.1
This GDB was configured as "i686-linux-gnu"
gdb-peda$ disas exit
Dump of assembler code for function exit@plt:
   0x080482e0 <+0>:     jmp    DWORD PTR ds:0x804a00c
   0x080482e6 <+6>:     push   0x0
   0x080482eb <+11>:    jmp    0x80482d0
End of assembler dump.

int 0x80보시다시피 책과 달리 테스트 환경에 대한 지침은 없습니다.

실수:

스택 충돌이 감지되었습니다.--- 이 오류를 극복하기 위해 가끔 작동하는 (-fno-stack-protector)를 사용했습니다.

또는

반품분할 오류(코어 덤프)--- 책에 언급조차 되지 않았을 때 이 오류가 발생했으며, 책에 있는 내용에 맞게 패치가 필요한 Linux 버전을 사용하고 있다는 것을 알았습니다.

그럼 책에 언급된 환경/운영체제를 추천해주실 수 있나요? 아니면 내 테스트 환경(Linux 4.15.0-106-generic #107~16.04.1-Ubuntu)에서 실행되도록 책에 언급된 바이너리를 컴파일할 수 있는 방법이 있습니까?

편집하다:

elf 파일 컴파일 명령:

gcc -m32 -fno-stack-protector exit.c -o exit

또한 이것을 시도했습니다.

gcc -static -m32 -fno-stack-protector exit.c -o exit 

어셈블리를 추가하면 -static다음이 제공됩니다.

gdb-peda$ disas exit
Dump of assembler code for function exit:
   0x0804e440 <+0>:     sub    esp,0x10
   0x0804e443 <+3>:     push   0x1
   0x0804e445 <+5>:     push   0x80eb070
   0x0804e44a <+10>:    push   DWORD PTR [esp+0x1c]
   0x0804e44e <+14>:    call   0x804e320 <__run_exit_handlers>
End of assembler dump.

답변1

책의 출력에서 ​​분해를 보여줍니다 _exit.

This GDB was configured as “i386-redhat-linux-gnu”...
(gdb) disas _exit

그러나 실험에서는 다음과 같이 분해했습니다 exit(앞에 밑줄이 누락되어 있음에 유의).

This GDB was configured as "i686-linux-gnu"
gdb-peda$ disas exit

이는 두 가지 별도의 기능이므로 사용하고 있는지 확인하세요 _exit. 이 답변에서는 두 기능의 차이점을 설명합니다.https://unix.stackexchange.com/a/5375/90691

또한 귀하의 출력에서 exit@plt​​"plt"는 동적 링크 기호를 해결하는 부분인 "프로시저 연결 테이블"을 나타냅니다. 다음을 사용하여 컴파일하는 -static경우 이 답변은 더 자세한 설명을 제공합니다.https://unix.stackexchange.com/a/256852/90691

-static책에 있는 프로그램 없이 컴파일하고 프로그램을 디스어셈블하려고 하면 다음과 같은 내용이 나타날 수 있습니다.

(gdb) disassemble _exit
No symbol "_exit" in current context.

그 이유는 프로그램에서 해당 기호를 참조하는 항목이 없기 때문입니다 _exit. 컴파일하면 -static문제가 해결될 수 있습니다. 그렇지 않은 경우 _exit대신 호출하도록 프로그램을 수정할 수 있습니다 exit.

마지막 으로 i386-redhat-linux-gnuVS. i686-linux-gnu전자는 386 프로세서에 적합하고 후자는 686 프로세서에 적합합니다. 둘 다 32비트이므로 운이 좋다면 686 툴체인을 사용할 수 있습니다.

관련 정보